Go言語で main.go が大きくなってきたので分割したい。本格的にコードを書きたいと思った時に困った事が、GitHubに登録することなく、ローカルに分割したモジュールを利用する方法でした。
他のコードを参照して、見様見真似で分割して、go run main.go
で実行しようとすると、import cycle not allowed
や is not in GOROOT
のエラーが発生してしまい、目的を果たすことができませんでした。
答えを探して、いろいろ検索しても、なかなか問題を解決する方法に出会えませんでした。いろいろ調べて整理できたので、忘備録として整理します。本記事は go v1.19 で検証しました。
mainの書き方(インポートする側)
Go言語のインポートに以下の例に従って追記する。tkr/mypkg
は モジュール名/パッケージ名となります。
package main
import (
"fmt"
"net/http"
"tkr/mypkg" <-- ローカルパッケージも標準のパッケージと同じ様に記述
)
func main() {
<以下省略>
モジュール名は go.mod に指定するものと同じ名前であり、パッケージ名は、*.goの最初の行に指定する名前と同じです。
go.modの作成
コマンドgo mod init <モジュール名>
を実行して、go.modを生成するか、それとも go.modを編集する。モジュール名は任意の名前で良い。
module tkr <-- モジュール名
go 1.19
パッケージ名でディレクトリを作成
パッケージ名のディレクトリの下には、任意の名前のファイルを配置できます。
.
├── go.mod
├── main.go
├── mypkg
│ ├── myfunc.go
│ └── mypkg.go
└── README.md
パッケージのディレクトリに配置する .go ファイルの先頭には、パッケージ名を設定しなければなりません。
package mypkg
func Add(x int, y int) (int) {
メインプログラムからの呼び方
関数などの頭にパッケージ名を付与して、関数名を記述します。
ans := mypkg.Add(1,2)
ビルド
以下のコマンドを実行すると、モジュール名と同じファイル名の実行形式が生成されます。
go build