🦍

Go runtime version と go.mod の go ディレクティブとの関係

2024/10/27に公開

ローカルにインストールされている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で翻訳

最後に

検証に使ったソースコードはここにまとめています。

https://zenn.dev/demouth/scraps/72071774838db6

こちらの記事を参考にしました。

https://speakerdeck.com/yamatoya/go1-dot-21karadao-ru-sareta-go-toolchainnoshi-zu-miwomarututojie-shuo

Discussion