🐈

Goの自作パッケージがインポートできない。

2024/09/09に公開

自己紹介

こんにちは。新卒で大手SIerに入り3年目になりますナオトです。最近、技術力向上に目的として触れたことのない言語「Golang」を勉強し始めました。自分のアウトプットの場、そして自分と同じ境遇に陥った方々が早く解決できるよう、情報を発信していこうと思います。拙い文章で恐縮ですが、どうぞよろしくお願いいたします!

早速ですが、自作パッケージが動かない。。。

golangのパッケージについて学んでいたら、初期の初期で躓きました(笑)
自作パッケージをmainから呼び出そうとすると以下のエラーが出て意味わからず。。。

package golang/practice/foo is not in std

ディレクトリ構成と各ファイルは以下のとおり

`ディレクトリ構成`
golang/
  ├── practice/
       ├── foo/
       │    └── foo.go
       └── main.go

main.go

import (
	"fmt"
	"golang/practice/foo"
)
func main() {
	fmt.Println(foo.Max)
	fmt.Println(foo.ReturnMin())
}

foo.go

package foo
const (
	Max = 100
	min = 1
)
func ReturnMin() int {
	return min
}

なぜこんな簡単な構成で正常終了しないのか、、、色々調べてやっとたどり着きました。

解決方法

ルートディレクトリ(今回だとgolang配下)で以下のコマンドを実行することでgo.modが追加され、
動くようになりました。

go mod init

実行したことにより、go.modがルートディレクトリ配下に出現。
ディレクトリ構成

golang/
  ├── practice/
  │    ├── foo/
  │    │    └── foo.go
  │    └── main.go
  └── go.mod

go.mod

module golang
go 1.23.0

その状態で再度実行してみると、なんと期待通りの結果が得られました(感動)
実行結果

100
1

上で挙げたコマンドはGoモジュールを初期化するコマンドのようです。go.modはモジュール名や依存パッケージ、Goのバージョンを管理するための大切なファイルであり、これがあることで外部パッケージの追加やモジュール単位でのパッケージ管理が正常に行えるとのこと。
少し時間がかかりましたが、答えにたどり着けてホッとしましたー

まとめ

今回、自作パッケージのインポートに苦戦しました。自分含め、初学者の方が陥りやすいエラーだと思います。今回は、パッケージ管理用のgo.modを配置することで解決できました。ファイルが一つないだけでシステムが動かないとは。。プログラミングは奥が深くてとても楽しいですね!
これからも情報発信をしていくのでよろしくお願いします!ありがとうございました!

Discussion