Go 博客

Go 1.20 发布!

Robert Griesemer,代表 Go 团队
2023 年 2 月 1 日

今天,Go 团队很高兴发布 Go 1.20,您可以通过访问 下载页面 获取。

Go 1.20 得益于更长的开发阶段,这是由更早的广泛测试和代码库的整体稳定性提升所带来的。

我们特别兴奋地推出 profile-guided optimization (PGO) 的预览版,它使编译器能够根据运行时配置文件信息执行特定于应用程序和工作负载的优化。向 go build 提供配置文件可以使编译器将典型应用程序的速度提高约 3-4%,我们预计未来的版本将从 PGO 中获益更多。由于这是 PGO 支持的预览版,我们鼓励大家尝试使用它,但仍有一些粗糙的边缘可能会阻止生产环境使用。

Go 1.20 还包括一些语言更改、对工具和库的许多改进,以及更好的整体性能。

语言更改

  • 预先声明的 comparable 约束现在也 满足 常规的 可比较类型,例如接口,这将简化泛型代码。
  • 函数 SliceDataStringStringData 已添加到包 unsafe 中。它们完成了用于实现独立的切片和字符串操作的函数集。
  • Go 的类型转换规则已扩展,允许 从切片直接转换为数组
  • 语言规范现在定义了数组元素和结构体字段 比较 的确切顺序。这阐明了在比较过程中出现恐慌时会发生什么。

工具改进

  • cover 工具 现在可以收集整个程序的覆盖率配置文件,而不仅仅是单元测试的配置文件。
  • go 工具 不再依赖于 $GOROOT/pkg 目录中预编译的标准库包存档,并且它们不再随发行版一起提供,从而导致下载文件更小。相反,标准库中的包按需构建并缓存在构建缓存中,就像其他包一样。
  • go test -json 的实现已得到改进,使其在存在意外写入 stdout 的情况下更加健壮。
  • go buildgo install 和其他与构建相关的命令现在接受一个 -pgo 标志,启用 profile-guided optimization,以及一个 -cover 标志,用于执行整个程序的覆盖率分析。
  • go 命令现在在没有 C 工具链的系统上默认禁用 cgo。因此,当 Go 安装在没有 C 编译器的系统上时,它现在将对标准库中可选使用 cgo 的包使用纯 Go 构建,而不是使用预分配的包存档(如上所述已删除)。
  • vet 工具 报告了更多可能在并行运行的测试中出现的循环变量引用错误。

标准库添加

  • 新的 crypto/ecdh 包提供对 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换的显式支持。
  • 新的函数 errors.Join 返回一个错误,它包装了一个错误列表,如果错误类型实现了 Unwrap() []error 方法,则可以再次获取这些错误。
  • 新的 http.ResponseController 类型提供了对 http.ResponseWriter 接口未处理的扩展的每个请求功能的访问。
  • httputil.ReverseProxy 转发代理包含一个新的 Rewrite 钩子函数,取代了以前的 Director 钩子。
  • 新的 context.WithCancelCause 函数提供了一种使用给定错误取消上下文的方法。该错误可以通过调用新的 context.Cause 函数来检索。
  • 新的 os/exec.Cmd 字段 CancelWaitDelay 指定了当关联的 Context 被取消或其进程退出时 Cmd 的行为。

性能提升

  • 编译器和垃圾回收器的改进降低了内存开销,并将整体 CPU 性能提高了高达 2%。
  • 专门针对编译时间的改进导致构建速度提高了高达 10%。这使得构建速度恢复到与 Go 1.17 相当的水平。

从源代码 构建 Go 版本 时,Go 1.20 需要 Go 1.17.13 或更高版本。将来,我们计划大约每年将引导工具链向前推进一次。此外,从 Go 1.21 开始,一些旧的操作系统将不再受支持:这包括 Windows 7、8、Server 2008 和 Server 2012、macOS 10.13 High Sierra 和 10.14 Mojave。另一方面,Go 1.20 添加了对 RISC-V 上 FreeBSD 的实验性支持。

有关所有更改的完整且更详细的列表,请参阅 完整的发行说明

感谢所有通过编写代码、提交错误、分享反馈和测试发布候选者为此次发布做出贡献的人。您的努力有助于确保 Go 1.20 尽可能稳定。与往常一样,如果您发现任何问题,请 提交问题

享受 Go 1.20!

下一篇文章:profile-guided optimization 预览
上一篇文章:分享您对使用 Go 进行开发的反馈
博客索引