2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

私はGoでプログラミングをしていると、しばしばimportのところでエラーになってしまうことがあります。
そんな悩みを解決したいと思い、今回のような記事を書くことにしました。

参考になれば幸いです。

パッケージとモジュールについて

まずはimportとは切っても切れない関係である「パッケージ」、「モジュール」について簡単に説明します。

パッケージ
フォルダ単位で、一つまたは複数の`*.go`ファイルをまとめたもの。同一フォルダ内のGoファイルの先頭には`package (パッケージ名)`が統一されている必要がある。 パッケージに含まれる機能を`import`で利用できる。
モジュール
パッケージを一つまたは複数のサブパッケージ(パッケージをもっと細かくしたもの)をまとめたもの。
あるフォルダにてモジュールだと宣言するには以下のようにします。
go mod init <モジュール名>

モジュール名はgithub.com/hoge/module1というような表記にします。モジュールを公開しない場合はmodule1というような名前でもかまいません。
いずれにしろ、最後の部分のパス名(この場合はmodule1)とモジュールのフォルダ名を合致させておくとよいです。

コマンドを入力すると現在いるフォルダにgo.modファイルが作成され、これ以下がまるごと「モジュール」になります。

importについて

まず、今回は例として以下のように簡易的なディレクトリ関係を想定し、main.goからhandlerのパッケージを参照する方法を考えます。

project
    └─ server
        ├─ handler
        │    ├─ user.go
        │    └─ work.go
        ├─ main.go
        └─ go.mod

また、go.modの中身はこのようになっているとします。

go.mod
module github.com/project/server

go 1.23.2

この場合、main.goの冒頭はこのようになります。

main.go
package main

import (
    "github.com/project/server/handler"
)

では次に、go.modファイルの中身がこのような場合を考えてみます。

go.mod
module github.com/project

go 1.23.2

go mod initを実行したディレクトリがserverではなく、projectだった場合だとこのような中身になります。

この場合、importパスはgithub.com/project/handlerとなります。

このように、importパスはモジュールのルートから見た相対パスで指定する必要があります。

ただ、ディレクトリ構造が上記のようになっているため、go.modファイルの中身(モジュールのルート)がこのようになっているのは不適切で、1つ前に紹介した方が良いと考えられます。

詳しくは以下の記事を参考にしてください。

おわりに

今回の記事では「パッケージ」や「モジュール」について軽く説明した後にimportについて触れました。結果として非常に初歩的なものになってしまいましたが、理解を深めることができて良かったです。

では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?