🦍
Go runtime version と go.mod の go ディレクティブとの関係
ローカルにインストールされているgoのバージョンと、go.modのgoディレクティブに設定した値が異なる場合の挙動を確認してみました。
結果は次の通りで、インストールされているgoのバージョンが1.21以上になると挙動が変わるので注意が必要です。
ローカルにgo 1.20以下がインストールされている場合
バージョン | 挙動 |
---|---|
go.modのgoディレクティブの方が大きい場合 | インストールされているgoバージョンでプログラムが実行されるが、ソースコード上で新しい文法を使っているとエラーとなり実行できない場合もある |
インストールされているgoバージョンの方が大きい場合 | インストールされているgoバージョンでプログラムが実行される |
ローカルにgo 1.21以上がインストールされている場合
バージョン | 挙動 |
---|---|
go.modのgoディレクティブの方が大きい場合 | プログラムを実行できずエラーになる。ただしGOTOOLCHAINの設定次第ではgo.modに記載されているgoバージョンが自動でインストールされ実行される |
インストールされているgoバージョンの方が大きい場合 | インストールされているgoバージョンでプログラムが実行される |
仕様について
Go Modules Reference にはこのように記載があります。
現在はgo 1.21以上を使っている人が多いと思いますので、とりあえずgo.modのgoディレクティブには動作可能な最小バージョンを記載すると思っておけば良さそうです。
- At go 1.21 or higher:
- The go line declares a required minimum version of Go to use with this module.
- go 1.21以上:
- go行は、このモジュールで使用するために必要なGoの最小バージョンを宣言しています。
DeepLで翻訳
最後に
検証に使ったソースコードはここにまとめています。
こちらの記事を参考にしました。
Discussion