Essential NOTE

モバイルとガジェットとITサービスとその他について予想したり指摘したりします

Go言語のパッケージimportで相対パスが使えない話

更新できていませんでしたが、Pixelbookのデフォルトで存在するLinuxDebian)で、無事にGo言語をインストール完了しまして。IDEもLiteIDEじゃないですが、個人的に好きだったVSCodeをインストールすることに成功しました。バリバリ楽しく書いてます。

そもそもLinuxに詳しくなさすぎるので、コンソールでカタカタやっているだけで学ぶことも多いのですが、知識ゼロからの学びはやはり楽しいですよね。最終的には誇れるくらいに知識が付けばと思っていますが、まあまだエセエンジニアなので自己啓発ですけれど。

 

さて。VSCodeの件は別途記事にしますが、今回はGoのimportの件です。めっちゃ基本的な話ですが、そこそこ皆さん混乱している上に、結果的にどう書くべきかが明示されていないケースが多かったので、備忘兼ねて書いておきます。

 

某書籍で学んでいる最中ですが、以下のような構成なプログラムを用意しています。 

zoo

→→→animals

↓     ↓

↓     →→→elephant.go

↓     →→→monkey.go

↓     →→→rabbit.go

→→→main.go

 

ざっくり言うと、

main.goから、各動物の名前のgoファイルに定義されているfuncを実行するもの

ですね。

各動物のgoファイルはパッケージ”animals”です。

 

今回はmain.goでanimlasをimportしようとした際に、どうにもうまく行かなかった話を書くだけでございます。

 以下、main.goのソースです。

package mainpackage main
 import (

  "fmt"

  "./animals"

)
 func main() {

  fmt.Println(animals.ElephantFeed())

  fmt.Println(animals.MonkeyFeed())

  fmt.Println(animals.RabbitFeed())
}

ポイントなのは赤太字です。

./で「今いる場所」を示すわけですが、更にそこから一つ掘った場所ということで./animalsですね。OS的には意味がわかりそうですが、Goはそうもいかないみたいですね。

ちなみにこれは書籍に書いてあったまんまですが、これだと動きません

 

更に調べていくと、2つのことがわかりました。

相対パスで動かすことができる(何かしらインストールする必要がある)

・Go的には相対パス参照がそもそも推奨されない。遅くなる

うーん。Python<Goで学びを勧めている理由「シンプル」「速度」が半減しそうなので、避けたいですね。

 

しかし絶対パス書くのか?ホームディレクトリのユーザ名から指定するわけじゃねえよな…?と悩んでいたのですが、なぜか相対パスでない解決策のサンプルが落ちてない。

(もしかしたらOSとかIDEによっては相対パスでもできちゃうのかもしれない。だって書籍に普通に書いてあるんだもん。)

 

と思っていたら以下知識を獲得

・そもそもコンパイル時には$GOPATH以下を探索する仕様

なるほど。$GOPATH/src配下にあればいいということだな。と理解して、赤太字を書き換えたところ成功しました。

"zoo/animals"

まあ、なーんだ。というか、そりゃそうかって感じですが。

PATH的に指定した$GOPATHがルート的になって、そこからのsrcまではGoが勝手に見てくれると。

あとはさもmain.goを叩くときみたいに指定してあげればよかったんですね。なーんだ。です。

 

たぶん普通すぎてあえて書いてないんだと思いますが、素人はこんなんでも足が止まったりするだろうので、一応書き残しておきます。

 

(記事書くのが面倒くさくなってきたからこうして逃げてるわけじゃないですからね!)