asdfでGoのバージョンを切り替える手順

## はじめに
<br>

この記事ではasdfをインストールするところから、実際にGoのバージョンを切り替えるまでの手順をまとめています。
<br>

最後まで読めば、簡単に手元のGoのバージョンを切り替えられるようになるはずです。
<br>

※本記事はIntel Macで動作確認済みです。
<br>

## asdfを使ってGoのバージョンを切り替える手順
<br>

以下の手順で進めます。
<br>

1. homebrewでasdfをインストール

2. 既存Go（公式インストーラ版）のアンインストール（もしあれば）

3. Zshの初期化スクリプトでasdfを有効化

4. asdfでGoをインストール

5. バージョンを切り替える
<br>

順番に見ていきます。
<br>

### 1. homebrewでasdfをインストール
<br>

まずはasdfをインストールします。
<br>

```zsh
$ brew install asdf
```
<br>

インストール後、次のようにバージョンを確認できればOKです。
<br>

```
$ asdf version                                            
0.16.5
```
<br>

### 2. 既存Go（公式インストーラ版）のアンインストール（もしあれば）
<br>

```zsh
$ which go  
/usr/local/go/bin/go
```
<br>

このように`/usr/local/go/bin/go`が表示される場合、すでに別の手段でGoをインストールしていると考えられます。
<br>

※Appleシリコンだと`/usr/local`ではなく`/opt/homebrew`だと思われる。
<br>

`pkgutil`でパッケージIDが確認できます。
<br>

```
$ pkgutil --pkgs | grep -i golang
org.golang.go
```
<br>

そちらが優先されてしまうことを防ぐため、アンインストールしましょう。
<br>

```
$ sudo rm -rf /usr/local/go
Password:
$ sudo pkgutil --forget org.golang.go
Forgot package 'org.golang.go' on '/'.
```
<br>

再び`which go`を実行し`go not found`と表示されればアンインストールできています。
<br>

```
$ which go
go not found
```
<br>

### 3. Zshの初期化スクリプトでasdfを有効化
<br>

asdfを使うにはシェル起動時に初期化スクリプトを読み込む必要があります。
<br>

`.zshrc`に追記・反映します。
<br>

```
$ echo '. /usr/local/opt/asdf/libexec/asdf.sh' >> ~/.zshrc
source ~/.zshrc
```
<br>

ドットとスクリプトパスの間にスペースを空ける必要がある点に注意しましょう。
<br>

### 4. asdfでGoをインストール
<br>

asdfはプラグイン制です。
<br>

Goを扱うためには次のコマンドでプラグインを追加します。
<br>

```
$ asdf plugin add golang
```
<br>

`asdf plugin list`を実行して`golang`の表示が確認できれば問題ないです。
<br>

```
$ asdf plugin list                                        
golang
```
<br>

続いてインストール可能なGoのバージョンを一覧で確認します。
<br>

```
$ asdf list all golang
1
1.2.2
1.3
1.3beta1

(省略）

1.12.15
1.12.16
1.12.17
1.13
1.13beta1

(省略）

1.23.6
1.23.7
1.24.0
1.24rc1
1.24rc2
1.24rc3
1.24.1
```
<br>

今回は例として最新の1.24.1を使います。
<br>

`asdf install golang 1.24.1`でインストール可能です。
<br>

```
$ asdf install golang 1.24.1
Platform 'darwin' supported!
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 76.2M  100 76.2M    0     0  55.8M      0  0:00:01  0:00:01 --:--:-- 55.8M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    64  100    64    0     0    156      0 --:--:-- --:--:-- --:--:--   156
verifying checksum
/Users/inouekazuya/.asdf/downloads/golang/1.24.1/archive.tar.gz: OK
checksum verified
```
<br>

次のようにインストールできていることを確認できればOKです。
<br>

```
$ asdf list golang
 *1.24.1
```
<br>

最後にインストールしたGoを`asdf set`コマンドでセットしましょう。
<br>

「設定をどこに書くか（ホーム or プロジェクト」によって、グローバル・ローカルを切り替えます。
<br>

#### グローバルに設定する場合
<br>

ホームディレクトリに移動し、`asdf set golang 1.24.1`を実行します。
<br>

```
$ cd ~
$ asdf set golang 1.24.1
```
<br>

すると`~/.tool-versions`が作成・更新され、全ディレクトリで`Go1.24.1`が使われるようになります。
<br>

#### ローカルに設定する場合
<br>

たとえば`~/go-sample`というディレクトリに移動して実行します。
<br>

```
$ cd ~/go-sample
$ asdf set golang 1.24.1
```
<br>

すると`~/go-sample/.tool-versions`が作成・更新され、このディレクトリ配下だけGo1.24.1が使われるようになります。
<br>

グローバルよりもローカルの優先度の方が高い点に注意です。
<br>

### 5. バージョンを切り替える
<br>

最後にバージョンを切り替える場合の操作です。
<br>

今回はGo1.13にさかのぼって動作確認したいケースを想定します。
<br>

と言っても流れは同じです。
<br>

以下のコマンドを順に実行しましょう。
<br>

```
$ asdf install golang 1.13
$ asdf list golang    
  1.13
 *1.24.1
$ asdf set golang 1.13
$ asdf list golang    
 *1.13
  1.24.1
```
<br>

`*`が現在のバージョンです。
<br>

`*1.13`となっていれば、バージョンの切り替えができています。
<br>

## まとめ
<br>

この記事ではasdfを使ってGoのバージョンを切り替える手順をまとめました。
<br>

バージョン間の差異を確認したりする場面で有効かなと思います。
<br>

参考になりましたら幸いです。