💨

go.modのgoディレクティブ

2021/10/01に公開

go.modの中にgoディレクトリと呼ばれるgoのバージョンを指定する項目があります。

go.mod
go 1.14

ここで書かれているgoのバージョンと、ローカルにインストールされているgoのバージョンはどのような関係にあるのか?例えば、上記のように1.14と指定されていた時に、ローカルのgoのバージョンが1.15だったらどうなってしまうのか?とか、よくわからなかったので調べてみました。

リファレンスに書いてありました。

goディレクティブは、モジュールがどのバージョンのGoを想定して書かれているかを表しています。goディレクティブは、もともとGo言語の後方互換性のない変更をサポートすることを目的とています。ただモジュールが導入されてから、後方互換性のない変更は存在しません。なので、1.17がリリースされている今現在では、1.13でコンパイルできるコードは、それ以降のgoのどのバージョンでも問題なく動作することを意味しています。

ただ、goディレクティブは、指定したバージョンによって利用できる言語機能に影響を与えます。例えば、go.modでgo 1.12と指定した場合、1.13で導入された1_000_000のような数値リテラルを使用できません。仮にローカルにインストールしているgoのバージョンが1.13でも使えません。

実際にやってみます。以下のmain.goを用意します。

main.go
package main

import (
    "fmt"
)

func main() {
    fmt.Println(1_000_000)
}

go.modで以下のように1.12を指定します。

go.mod
...
go 1.12

これでgo buildを実行すると以下のようにエラーになりました。

./main.go:8:17: underscores in numeric literals requires go1.13 or later (-lang was set to go1.12; check go.mod)

これ以外にも指定したバージョンによって、動作が変わることがあります。詳しくはリファレンスを参照してください。

Discussion