CLOVER🍀

That was when it all began.

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

これは、なにをしたくて書いたもの?

Goはapt(+PPA)でインストールしているのですが、他のバージョンが使いたくなる時もあったりします。

Ubuntu · golang/go Wiki · GitHub

こういう時はどうしたらいいのかな?と思ったのですが、Go自体が複数バージョンのGoをインストールする方法をドキュメントに
書いていますね。

Managing Go installations - The Go Programming Language

調べている過程でgvmやgoenvというのも見つけましたが、こちらはあまり更新されていなさそう。

GitHub - moovweb/gvm: Go Version Manager

GitHub - syndbg/goenv: Like pyenv and rbenv, but for Go.

gvmは、SDKMANが名前を変えた理由だったような?

Home - SDKMAN! the Software Development Kit Manager

ちょっと蛇足ですね。

環境

今回の環境は、こちら。

$ go version
go version go1.16 linux/amd64

あらかじめPPAを追加してインストールしたGoがある環境です。

Ubuntu · golang/go Wiki · GitHub

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

では、Goの他のバージョンをインストールしてみましょう。方法としては、以下のドキュメントに従います。

Managing Go installations / Installing multiple Go versions

実行するコマンドとしては、以下になります。

$ go get golang.org/dl/go[Goのバージョン]
$ go[Goのバージョン] download

Goのバージョンは、ダウンロードページなどから探したらよいでしょう。

Downloads - The Go Programming Language

golang.org/dl

ここからは、実際に他のバージョンのGoをインストールしてみます。今回は、1.15.7と1.14.15(それぞれ1.15、1.14系の現時点での
最新バージョン)をインストールしてみましょう。

go getでGo 1.15.7をインストールします。GO111MODULE=onは、なんとなく付けておきました…。

$ GO111MODULE=on go get golang.org/dl/go1.15.7
go: downloading golang.org/dl v0.0.0-20210220033039-562909534da3

これで、以下のようにパスを通していればgo1.15.7というコマンドが使えるようになります。

export PATH=${HOME}/go/bin:${PATH}

ですが、この時点ではまだ指定のバージョンのGoは使えるようになっていません。

$ go1.15.7 version
go1.15.7: not downloaded. Run 'go1.15.7 download' to install to $HOME/sdk/go1.15.7

downloadが必要です。

$ go1.15.7 download

ダウンロードの様子。

$ go1.15.7 download
Downloaded   0.0% (    16384 / 121031670 bytes) ...
Downloaded   3.5% (  4210688 / 121031670 bytes) ...
Downloaded  11.3% ( 13664256 / 121031670 bytes) ...
Downloaded  19.8% ( 23953408 / 121031670 bytes) ...
Downloaded  28.3% ( 34242560 / 121031670 bytes) ...
Downloaded  36.3% ( 43876352 / 121031670 bytes) ...
Downloaded  44.2% ( 53477376 / 121031670 bytes) ...
Downloaded  52.6% ( 63635456 / 121031670 bytes) ...
Downloaded  60.8% ( 73596928 / 121031670 bytes) ...
Downloaded  68.7% ( 83197952 / 121031670 bytes) ...
Downloaded  76.4% ( 92504064 / 121031670 bytes) ...
Downloaded  82.9% (100368384 / 121031670 bytes) ...
Downloaded  88.5% (107070216 / 121031670 bytes) ...
Downloaded  95.9% (116114184 / 121031670 bytes) ...
Downloaded 100.0% (121031670 / 121031670 bytes)
Unpacking $HOME/sdk/go1.15.7/go1.15.7.linux-amd64.tar.gz ...
Success. You may now run 'go1.15.7'

これで、Go 1.15.7が使えるようになります。

$ go1.15.7 version
go version go1.15.7 linux/amd64

Go 1.14.15もダウンロードしてみましょう。

$ GO111MODULE=on go get golang.org/dl/go1.14.15
$ go1.14.15 download

確認。

$ go1.14.15 version
go version go1.14.15 linux/amd64

インストール先を確認する

それぞれのコマンドの場所を確認してみます。

$ which go
/usr/bin/go


$ which go1.15.7
$HOME/go/bin/go1.15.7


$ which go1.14.15
$HOME/go/bin/go1.14.15

繰り返しますが、Go 1.16(which goの結果)だけは、aptでインストールしたものです。

各GoのGOROOT環境変数を見ると、対象のGoがインストールされている場所を確認できます。

$ go env GOROOT
/usr/lib/go-1.16


$ go1.15.7 env GOROOT
$HOME/sdk/go1.15.7


$ go1.14.15 env GOROOT
$HOME/sdk/go1.14.15

go get golang.org/dl/go[Goのバージョン]でダウンロードしたものは$HOME/go/binに配置され、go[Goのバージョン] downloadで
保存したものは$HOME/sdkにインストールされます、と。

$HOME/sdkディレクトリの中身も見ておきます。

$ ll $HOME/sdk
合計 16
drwxr-xr-x  4 xxxxx xxxxx 4096  2月 23 19:15 ./
drwxr-xr-x  6 xxxxx xxxxx 4096  2月 23 19:12 ../
drwxr-xr-x 10 xxxxx xxxxx 4096  2月 23 19:15 go1.14.15/
drwxr-xr-x 10 xxxxx xxxxx 4096  2月 23 19:12 go1.15.7/

確かに、各バージョンのGoがあります。

プログラムを動かしてみる

versionコマンドだけでの確認もなんなので、プログラムも動かしておきましょう。

使用しているGoのバージョンを表示するものがよいですね、こちらを使いましょう。

Package runtime / func Version() string

こんなプログラムを用意。

main.go

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Printf("Hello Go: %s\n", runtime.Version())
}

確認。

$ go run main.go
Hello Go: go1.16


$ go1.15.7 run main.go
Hello Go: go1.15.7


$ go1.14.15 run main.go
Hello Go: go1.14.15

OKそうですね。

アンインストール

アンインストール方法もドキュメントに記載があります。

Managing Go installations / Installing multiple Go versions

今回の方法でインストールした場合は、以下は違いますね…。

Managing Go installations / Uninstalling Go

今回インストールした、Go 1.14.15をアンインストールしましょう。以下のコマンドでアンインストールできます。

$ rm $HOME/go/bin/go1.14.15
$ rm -rf $HOME/sdk/go1.14.15

つまり、

$ rm $HOME/go/bin/go[Goのバージョン]
$ rm -rf $HOME/sdk/go[Goのバージョン]

ですね。

こんな感じでしょうか。覚えておきましょう。