go run main.goとすると別ファイルのmainパッケージのグローバル関数がundefinedで怒られる

めっちゃ久しぶりのブログになってしまった。

書くことなんか何個でもあるのに、バタバタしてたりでアウトプットを疎かにしていた。(言い訳)

本題

少し前から気になってたことだったんだけど、go run main.go で実行すると、mainパッケージの別ファイルのグローバルな関数の呼び出しができない。

github.com

最小構成のリポジトリを作った。

これを、適当にcloneして、 go run main.go すると実行できない。

解決策

buildする。 go build -o main && ./main で buildすると実行できる。

どうしてもgo runしたいときの解決策

1. go run main.go lib.go ファイルを列挙する

ルートにファイルが増えると面倒なので、できたらやめたほうがいいと思う。

2. go run *.go *でごまかす

この方法は楽なんだけど、テストのファイル(例) main_test.go)があると破綻する。

同じようにハマってる人がいた

stackoverflow.com

この件で不思議なのは、main以外のパッケージだと普通に読み込めるところ。 例えば、こういう構成だったら大丈夫。

root/
  --- main.go
  --- lib/
  ------ hello.go

この場合は import "host/username/root/lib" というふうにimport文を書くからそこから解決して実行できるんだろうな(想像)

これ、初めて遭遇したときはびっくりするんだよな。