Go历史上最大的破坏向后兼容性的版本。 发布说明甚至没有提到 Go 1.22 会破坏向后兼容性这一事实。
网友观点:
- 部分破坏,这取决于为每个引用模块设置的 go.mod 版本。这样做比较温和,但如果任何模块提高了版本,可能会产生负面影响。
- 要使这一更改具有破坏性,需要将 go.mod 更新到 1.22 版,因此您显然选择了接受这一更改。你也可以说,在大多数情况下,新行为都是我们所希望的,它所修复的问题可能比它带来的问题更多。 这是一个很好的改动。
1.22版本发布
最新的 Go 版本 1.22 在Go 1.21发布六个月后发布。它的大部分变化在于工具链、运行时和库的实现。与往常一样,该版本保持了 Go 1的兼容性承诺?我们期望几乎所有 Go 程序都能像以前一样继续编译和运行。
语言的变化
- Go 1.22 对“for”循环进行了两处更改。
- Go 1.22 包括我们正在考虑为 Go 的未来版本进行的语言更改的预览:范围函数迭代器。构建GOEXPERIMENT=rangefunc可以启用此功能。
工具的变化
- 执行命令
- 跟踪
- vet工具
运行变化:
- 运行时使基于类型的垃圾收集元数据更接近每个堆对象,从而将 Go 程序的 CPU 性能(延迟或吞吐量)提高了 1-3%。
编译器:
- 配置文件引导优化 (PGO)构建现在可以比以前实现更高比例的调用去虚拟化。
- 编译器现在交错去虚拟化和内联,因此接口方法调用得到了更好的优化。
- Go 1.22 还包括编译器内联阶段的增强实现的预览,该阶段使用启发式方法来提高被认为“重要”的调用站点(例如,循环中)的内联性,并阻止被认为“不重要”的调用站点(例如,在循环中)的内联。恐慌路径)。
链接器:
linker的 -s 和-w标志现在在所有平台上的行为更加一致。
- -w标志抑制 DWARF 调试信息生成。
- -s标志抑制符号表生成。
引导程序
正如Go 1.20 发行说明中提到的,Go 1.22 现在需要 Go 1.20 或更高版本的最终版本进行引导。我们预计 Go 1.24 将需要 Go 1.22 或更高版本的最终版本进行引导。
核心库
- 新的 math/rand/v2 包
- 增强的路由模式:使用的模式net/http.ServeMux已得到增强,可以接受方法和通配符。