Golangで謎エラーが出た

MacでGoをアップデートしたら、見たことないエラーが出てきてびっくりしたのでその話。

 

謎エラーが出た

$ cat hello.go 
package main

import "fmt"

func main() {
	fmt.Printf("hello world\n")
}

こんな感じのHello Worldを書いてビルドすると、

$ go run hello.go 
# errors
compile: version "go1.10" does not match go tool version "go1.10.2"
# internal/race
compile: version "go1.10" does not match go tool version "go1.10.2"
# runtime/internal/sys
compile: version "go1.10" does not match go tool version "go1.10.2"
# runtime/internal/atomic
compile: version "go1.10" does not match go tool version "go1.10.2"
# unicode/utf8
compile: version "go1.10" does not match go tool version "go1.10.2"
# internal/cpu
compile: version "go1.10" does not match go tool version "go1.10.2"
# unicode
compile: version "go1.10" does not match go tool version "go1.10.2"
# sync/atomic
compile: version "go1.10" does not match go tool version "go1.10.2"

とりあえずversionがあってないっぽいので本能に従って

$ brew upgrade go
Error: go 1.10.2 already installed

まあアプデしたばっかりで当然最新バージョンなので、アプデはできず。

検索しても、いまいち同じ症状で悩んでる人が見つからなくて八方塞がり感があった。 

 

治った

再インストールしてみたら原因がわかった。

$ brew uninstall --force go
$ brew install go
$ go run hello.go
go: cannot find GOROOT directory: /usr/local/Cellar/go/1.10/libexec
$ ls /usr/local/Cellar/go
1.10.2

あーーーー!GOROOTミスってるだけやん!!

というわけでGOROOT設定しなおしてみる。

$ export GOROOT="/usr/local/Cellar/go/1.10.2/libexec"
$ go run hello.c
hello world

普通に動いた。

 

原因はHomebrew

今回のはHomebrewが悪さをしていたみたい。

Homebrewはインストールしたパッケージはデフォルトでは

/usr/local/Cellar

に保存するんですが、バージョンが違うパッケージはバージョンごとに保存してしまうので、今回みたいなことが起こります。

gccとかのデカいパッケージは古いバージョンも丸々残っていると、容量めちゃくちゃ食うから定期的に使わない古いバージョンは消しておきたいね(自分の環境ではこれだけで2GBくらい空き容量が増えた)

 

対策

これで環境変数が崩れるのはGo関係なくヤバさがあるので、さすがにHomebrew害悪過ぎでしょって思っていたら、Homebrewはちゃんとそれぞれの最新バージョンのシンボリックリンクを貼ってくれるらしいです。

/usr/local/bin
/usr/local/lib
/usr/local/opt

このあたりにシンボリックリンクが貼られます。

export GOROOT="/usr/local/opt/go/libexec"

これを~/.bashrcに書いておけば、今後アップデートしてもちゃんと使えそう。

 

まとめ

今回はHomebrewを使っていく上で、Goだけじゃなくていろんな場面で関係してくるエラーで、Homebrewのディレクトリ構成についてちょっぴり詳しくなれたので、学びのあるトラブルシューティングになって良かった。

でも同じことで悩んでる人普通にたくさんいそうだけど、なんで検索しても情報出てこなかったんだろう。