はじめに
私は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
の中身はこのようになっているとします。
module github.com/project/server
go 1.23.2
この場合、main.go
の冒頭はこのようになります。
package main
import (
"github.com/project/server/handler"
)
では次に、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
について触れました。結果として非常に初歩的なものになってしまいましたが、理解を深めることができて良かったです。
では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。
参考