annidy / notes

0 stars 0 forks source link

go.mod toolchain directive #283

Open annidy opened 4 months ago

annidy commented 4 months ago

在go 1.21版本之后,go.mod文件中新增了一个toolchain指令,并且不支持旧的go版本

go 1.21

toolchain go1.21.5

第一行表示go语言最低版本要求是1.21。不过这并不强制,用低版本的go编译高版本的mod也是可以的,除非遇到不支持的语法。

虽然go官方一直保持前向兼容,但是总免不了有些例外。比如go 1.22的新特性 Proposal: Less Error-Prone Loop Variable Scoping

语法没变,但是语义发生变化。不同版本编译器生成的程序,最终行为是不一样的。因此,才在mod中添加了新的指令,用于指定编译器的版本。

比较有意思的是,编译器版本会像依赖一样,当在本地找不到对于编译器时,会自动从仓库中下载。下载后不会影响系统中的go版本。

GOTOOLCHAIN环境变量

go现在可以随时下载任意版本的toolchain,比如

go install golang.org/dl/go1.22.0@latest

但系统中有多个版本,如何指定用那个?有两种方法

  1. 用带版本的go,比如go1.22.0 download
  2. 设置环境变量,go env -w GOTOOLCHAIN=go1.22.0export GOTOOLCHAIN=go1.22.0。这个是比较标准的做法

默认GOTOOLCHAIN环境变量是auto,此时会根据 go.mod 中的自动选择。我们也可以设置为 "go1.22.0+auto",优先使用1.22.0.

https://go.dev/doc/toolchain Go 1.21中值得关注的几个变化 GopherCon 2022: Russ Cox - Compatibility: How Go Programs Keep Working - go.mod中的版本是有意义的。虽然go保持向后兼容,前提是你告诉它你写代码时用的版本