Goを複数バージョンインストールする

はじめに

これまでは、バックエンドの開発でgo1.17系を使っていましたが、別アプリケーションの開発をすることになりました。 そちらのアプリケーションではgo1.18で作成されていたため、最初の環境構築時にGoのバージョン違いによりエラーが発生しました。 今後もこれまで関わっていたアプリケーションの開発を行う可能性もあるため、複数Goバージョンでの開発が必要になり実施することにしました。

結論

複数バージョンのインストールする、というタイトルとは矛盾しますが、 下記にあるように、Go言語は後方互換性を保っているため、 特別な理由が無い場合は複数バージョン持たずに最新版をインストールしておけば問題ありません。 セキュリティ面や不具合等によっては互換性が保てない場合も出てくる可能性はありますが、これまでのところ出てはいないようです。

go.dev

インストーラでインストール

現在のバージョンをアンインストール後、ダウンロードページにて最新版を取得してイストールしましょう。 アンインストールは下記のように直接ディレクトリを削除することで完了します。

rm -rf /usr/local/go

go.dev

brewでインストール

# 最新版にアップグレード
brew upgrade go

バージョンを指定する場合

# アンインストール
brew remove go
# バージョンを指定してインストール
brew install go@1.18

go.dev

とはいえ

テストコードが十分ではないアプリケーションのバージョンを気軽に上げるのはやはり抵抗はありますよね? また、ベータバージョンのGoで搭載される新機能を試してみたい場合、 ローカルのバージョン上げてしまうと、プロダクトの開発で使用しているバージョンと異なってしまうため、業務に支障をきたします。 ということで、複数バージョンをインストールできる方法を知っておくと便利です。

バージョンが異なることでどんなエラーが発生するか

複数バージョンのインストール方法の前に、バージョンが合わない場合に、どのようなエラーが表示されるかを示しておきます。

go mod tidy

エラーが出て実行できません。

go mod tidy

go mod tidy: go.mod file indicates go 1.18, but maximum supported version is 1.17

go mod vendor

特にエラー発生せず。vendorディレクトリが作成されます。

go run

こちらも特にエラー発生せず。アプリケーションも動作しました。

go test

注意は出ますが、一応テストは実行可能。※下記「note:」の部分 上位バージョン特有の書き方が実行ファイルに存在する場合はエラーになるかもしれません。

go test ./...

〜〜 中略 〜〜
note: module requires Go 1.18
?       app/path  [no test files]
?       app/path/one   [no test files]
ok      app/path/two   0.532s

複数バージョンのインストール

他のプログラム言語では、複数バージョン管理するために○○env的なパッケージを用いるのが多いです。 Goにもgoenvなるものがありますが、公式で提示されている方法がありますので、そちらで実施していきます。

go.dev

下記のコマンドでの[バージョン]の部分を好きなバージョンに変えて実行すればOKです。

$ go install golang.org/dl/go[バージョン]@latest
$ go[バージョン] download

インストール可能なバージョンについては、ダウンロードページを確認することで、存在するバージョン番号を知ることができます。

go.dev

現時点の最新版はgo1.19.1、1.18系の最新版は、go1.18.6となっています。 go1.18の場合は下記のコマンドになります。

go install golang.org/dl/go1.18.6@latest
go1.18.6 download

# バージョン確認
go1.18.6 verion

go version go1.18.6 darwin/amd64

続けてgo1.17もインストールしてみます。 go1.17の最新版は1.17.13なので下記のコマンドです。

go install golang.org/dl/go1.17.13@latest
go1.17.13 download

# バージョン確認
go1.17.13 version

go version go1.17.13 darwin/amd64

ということで複数バージョンのGoをインストールすることができました。

使い方

各バージョンのGoを実行するには、goの後ろにインストールしたバージョンを付けてコマンドを実行することになります。

go1.18.6 verion

go1.18.6 env GOROOT

go1.18.6 run main.go

...etc

アンインストール

ダウンロードしたバージョンをアンインストールするには、 GOROOT環境変数で指定されたディレクトリを削除するだけです。

インストールしたGoはインストーラでインストールした場合と異なり$HOME/sdk 配下に保存されています。

Goのアンインストール

goのインストール先の確認

go1.18.6 env GOROOT

ディレクトリ削除

rm -rf $(go1.18.6 env GOROOT)

/etc/paths.d/goを削除する

rm -rf /etc/paths.d/go

おまけ

Go 2.0が登場すると今回の記事の内容がより活用できる場が増えるかもしれません。 Goは2月と8月にマイナーバージョンが上がりますので、 予定通りであればGo 1.20は、2023年2月のリリースとなります。

下記の記事ではGo 1.20がGo 2.0となるような内容にも読めるため、 来年Go 2.0がリリースされるかもしれませんね。

go.dev