Go言語でフォルダ内のローカルパッケージをインポートする手順を解説
Go言語でプログラムを作成しているとき、とりあえず一部をパッケージ化してインポートしたい場合があります。この記事では、サブフォルダ(ディレクトリ)内のパッケージをインポートする手順について解説します。Go言語に慣れていないと結構ハマるポイントなので参考になれば幸いです。
サブディレクトリのパッケージをインポートする
この記事では、モジュールの配下のディレクトリ(サブフォルダ)に存在するパッケージをインポートする手順について解説します。
gitなどの構成管理ツールを使用せずに、Go言語でプログラミングを書いていると、こういった部分でよくトラブります。
やり方さえ知っていれば難しくないのですが、初めての場合結構ハマる部分だと思います。
Go言語を使い始めた当初、サブフォルダにあるパッケージのインポートでかなり悩みました。バージョンが変わって簡単になっていますが、それでも初心者がハマるポイントだと思います。
この記事では、インポート用のサンプルコードを作りながら、基本的な手順について解説します。
フォルダ構成
サンプル用に作成したファイルとフォルダ構成は以下になります
- モジュールのフォルダ直下にmain.go(mainパッケージ)を配置
- calcフォルダにcalcパッケージを配置
- go.modは
go mod init
で生成
.
├── calc
│ └── calc.go
├── go.mod
└── main.go
それぞれのファイルの内容
main.go
mainパッケージです。calcパッケージのAddを呼び出しています。
モジュール配下のパッケージを読み込む場合は、import "<モジュール名>/<パッケージ名>"
で読み込むことができます(パッケージが複数階層になっている場合もOK)。
package main
import (
"fmt"
"sample/calc"
)
func main() {
fmt.Println("x", calc.Add(10, 20))
}
calc/calc.go
calcパッケージです。Go言語の命名ルールとして、外部から参照する関数は大文字から始めることを忘れないようにします(Add
のA
が大文字になっていることに注意)
package calc
func Add(a, b int) int {
return a + b
}
パッケージ外から参照される関数の名前は大文字から始めなければならないことは忘れがちです。小文字だと外部からはアクセスできないので注意
ファイルを作成した状態で、ルートフォルダでgo run main.go
としてプログラムを実行しようとすると、以下のようなメッセージが出力されてエラーが発生するはずです。
main.go:5:2: package sample/calc is not in std
sample/calc
が見つからないのでエラーとなっていることがわかります。これを解決するために、.mod
ファイルを作成します。
go mod を使う
ここからの手順が重要です。
以下のコマンドでgo.modファイルを生成します
go mod init sample
sample
の部分は「モジュール名」です。githubで管理している場合は、/github/<ユーザ名>/<リポジトリ名>の形式になりますが、ローカルのみの場合はなんでもOKです。
module sample
go 1.21.5
モジュール配下のパッケージを参照する場合は、go.modになにも追加する必要はありません。
今回の記事を書いている時に、結構エラーが発生しました。理由は不明です・・・
うまくいかない場合は、手順を変えてみてください。今回は、main.go
, calc.go
を作成した後、go mod init
の手順でうまくいきました。
go.mod
ファイルができた状態でgo run main.go
を実行すると、パッケージをインポートして実行できるはずです。
まとめ
Goのモジュール関連は、Goのバージョンが変わって何度か修正されています。以前のやり方がうまく動かないことがあるので、記事とバージョンが異なる場合は注意しましょう。