LoginSignup
0
0

Go言語 ローカルパッケージのインポート

Posted at

Go言語で main.go が大きくなってきたので分割したい。本格的にコードを書きたいと思った時に困った事が、GitHubに登録することなく、ローカルに分割したモジュールを利用する方法でした。

他のコードを参照して、見様見真似で分割して、go run main.go で実行しようとすると、import cycle not allowedis not in GOROOT のエラーが発生してしまい、目的を果たすことができませんでした。

答えを探して、いろいろ検索しても、なかなか問題を解決する方法に出会えませんでした。いろいろ調べて整理できたので、忘備録として整理します。本記事は go v1.19 で検証しました。

mainの書き方(インポートする側)

Go言語のインポートに以下の例に従って追記する。tkr/mypkg は モジュール名/パッケージ名となります。

main.go
package main

import (
	"fmt"
	"net/http"
	"tkr/mypkg"  <-- ローカルパッケージも標準のパッケージと同じ様に記述
)

func main() {
<以下省略>

モジュール名は go.mod に指定するものと同じ名前であり、パッケージ名は、*.goの最初の行に指定する名前と同じです。

go.modの作成

コマンドgo mod init <モジュール名>を実行して、go.modを生成するか、それとも go.modを編集する。モジュール名は任意の名前で良い。

go.mod
module tkr  <-- モジュール名

go 1.19

パッケージ名でディレクトリを作成

パッケージ名のディレクトリの下には、任意の名前のファイルを配置できます。

.
├── go.mod
├── main.go
├── mypkg
│   ├── myfunc.go
│   └── mypkg.go
└── README.md

パッケージのディレクトリに配置する .go ファイルの先頭には、パッケージ名を設定しなければなりません。

myfunc.go
package mypkg

func Add(x int, y int) (int) {

メインプログラムからの呼び方

関数などの頭にパッケージ名を付与して、関数名を記述します。

	ans := mypkg.Add(1,2)

ビルド

以下のコマンドを実行すると、モジュール名と同じファイル名の実行形式が生成されます。

go build

参考資料

0
0
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
0
0