Go 1.22:Golang历史上最大的破坏向后兼容性版本

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 包
  • 新的go/version
  • 增强的路由模式:使用的模式net/http.ServeMux已得到增强,可以接受方法和通配符。