💨
go.modのgoディレクティブ
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