go run main.goとすると別ファイルのmainパッケージのグローバル関数がundefinedで怒られる
めっちゃ久しぶりのブログになってしまった。
書くことなんか何個でもあるのに、バタバタしてたりでアウトプットを疎かにしていた。(言い訳)
本題
少し前から気になってたことだったんだけど、go run main.go
で実行すると、mainパッケージの別ファイルのグローバルな関数の呼び出しができない。
最小構成のリポジトリを作った。
これを、適当にcloneして、 go run main.go
すると実行できない。
最小構成のサンプル作った。https://t.co/nvec9r5CYq pic.twitter.com/XEFZQaj9Ge
— serinuntius (@_serinuntius) July 15, 2018
解決策
buildする。
go build -o main && ./main
で buildすると実行できる。
どうしてもgo runしたいときの解決策
1. go run main.go lib.go
ファイルを列挙する
ルートにファイルが増えると面倒なので、できたらやめたほうがいいと思う。
2. go run *.go
*でごまかす
この方法は楽なんだけど、テストのファイル(例) main_test.go)があると破綻する。
同じようにハマってる人がいた
この件で不思議なのは、main以外のパッケージだと普通に読み込めるところ。 例えば、こういう構成だったら大丈夫。
root/ --- main.go --- lib/ ------ hello.go
この場合は import "host/username/root/lib"
というふうにimport文を書くからそこから解決して実行できるんだろうな(想像)
これ、初めて遭遇したときはびっくりするんだよな。