我正在try 理解go.mod文件中新添加的toolchain指令,到目前为止,它指示在当前模块中应该使用哪个版本的工具链.它还优先于GO指令,后者定义了包含此模块的人必须拥有的工具链的最低版本.

我try 在一个示例中测试这一点,该示例向Golang for循环(this)添加了新的更改.事实上,随着我将Go指令从1.21更改为1.22,程序的行为也发生了变化.然而,如果我将GO指令设置为1.21,将工具链指令设置为1.22.0,我仍然可以从1.21获得行为.换句话说,工具链指令看起来根本没有任何效果……

我的go.mod文件如下(忽略模块名,我只是在本地测试它).

module HelloWorld

go 1.21

toolchain go1.22.0

GOTOOLCHAIN变量设置为AUTO.我用的是高朗go1.22.0 windows/amd64版本.

推荐答案

它的工作原理如文档所述:go行定义了版本范围的语言功能标志,toolchain行定义了当您运行go命令时运行哪些可执行文件.

您链接的关于对for个循环的更改的文档声明:

为了确保与现有代码的向后兼容性,新的语义将仅适用于在go.mod文件中声明go 1.22或更高版本的模块中包含的包.

这意味着,如果它设置为go 1.22或更高,您将获得新行为,如果它设置为go 1.21或更早,您将获得旧行为,句号.它没有提到toolchain指令.

toolchain指令文档规定:

在标准配置中,当工具链至少与主模块或工作区中的gotoolchain行一样新时,go命令使用其自己的Bundle 工具链.例如,在说明go 1.21.0的主模块中使用与GO 1.21.3Bundle 在一起的go命令时,go命令使用GO 1.21.3.当第gotoolchain行比Bundle 工具链新时,go命令将改为运行较新的工具链.例如,当在指定为go 1.21.9的主模块中使用与GO 1.21.3Bundle 在一起的go命令时,go命令会找到并运行GO 1.21.9.

因为您已经安装了Go 1.22,所以将toolchain设置为1.21或1.22具有相同的行为:内置工具链是相同的版本或更新的版本,所以这就是使用的版本.

Go相关问答推荐

golang 的通用 map 功能

Golang测试容器,无法使网络正常工作

go mod tidy会自动升级go.mod中的go版本吗?

为什么 Go 对于长度为 100k 的切片使用的内存比长度为 100k 的数组要少?

是否可以使用标准库构建 Go 二进制文件?

Go 中的 protobuf FieldMask 解组

使用GOTK3和librsvg在Go中如何加载内联SVG?

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

Go 中的 Azure JWT 验证不起作用

更改多对多连接表的名称

Go:如何在将 float64 转换为 float32 时判断精度损失

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

未定义 protoc protoc-gen-go 时间戳

如何使用特定的 Go 版本运行 govulncheck?

此代码如何生成内存对齐切片?

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

go 堆栈跟踪:在某些函数调用参数或返回值之后的问题(?)标记是什么意思?

递归数据 struct 解组在 Go Lang Protobuf 中给出错误无法解析无效的线格式数据

从 map 返回空数组而不是空字符串数组

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?