Table of Contents generated with DocToc
Go 1.21通过增强go语句语义和添加工具链管理,大幅改进了Go语言的向前兼容性。
// go.mod
module demo1
go 1.20
上面go.mod文件中的go directive表示建议使用Go 1.20及以上版本编译本module代码,但并不强制禁止使用低于1.20版本的Go对module进行编译。你也可以使用Go 1.19版本,甚至是Go 1.15版本编译这个module的代码
// go.mod
module demo1
go 1.21.1 // 指定最小可用版本为Go 1.21.1
是否执行自动工具链下载和缓存、Go toolchain switches(Go工具链切换)以及切换的工具链的版本取决于GOTOOLCHAIN环境变量的设置、go.mod中go和toolchain指示的版本。
当go命令捆绑的工具链与module的go.mod的go或工具链版本一样时或更新时,go命令会使用自己的捆绑工具链。例如,当在main module的go.mod包含有go 1.21.0时,如果go命令绑定的工具链是Go 1.21.3版本,那么将继续使用初始toolchain的版本,即Go 1.21.3
而如果go.mod中的go版本写着go 1.21.9,那么go命令捆绑的工具链版本1.21.3显然不能满足要求,那此时就要看GOTOOLCHAIN环境变量的配置。
$cat go.mod
module demo1
go 1.23.1
toolchain go1.23.1
$GOTOOLCHAIN=go1.24.1+auto go build
go: downloading go1.24.1 (darwin/amd64) // 使用name指定工具链,但该工具链本地不存在,于是下载。
$GOTOOLCHAIN=go1.20.1+auto go build
go: downloading go1.23.1 (darwin/amd64) // 使用go.mod中的版本的工具链
当GOTOOLCHAIN设置为<name>+auto时,go命令会根据需要选择并运行较新的Go版本。具体来说,它会查询go.mod文件中的工具链版本和go version。 如果go.mod 文件中有toolchain行,且toolchain指示的版本比默认的Go工具链(name)新,那么系统就会调用toolchain指示的工具链版本;反之会使用默认工具链。