Go 博客
Go 1.20 发布!
今天,Go 团队很高兴地发布 Go 1.20,您可以通过访问 下载页面 来获取它。
Go 1.20 受益于一个更长的开发周期,这得益于更早的广泛测试以及代码库整体稳定性的提高。
我们特别高兴地推出了 Profile-Guided Optimization (PGO) 的预览版,它使编译器能够基于运行时剖析信息执行特定于应用程序和工作负载的优化。为 go build 提供剖析信息可以使编译器将典型应用程序的速度提高约 3-4%,我们预计未来的版本将从 PGO 中受益更多。由于这是 PGO 支持的预览版本,我们鼓励大家尝试一下,但仍有一些不完善之处,可能会妨碍生产环境的使用。
Go 1.20 还包含了一些语言变更、许多工具和库的改进,以及整体性能的提升。
语言变更
- 预声明的
comparable约束现在也能被普通的 可比较类型(例如接口)满足,这将简化泛型代码。 - 已将 `SliceData`、`String` 和 `StringData` 函数添加到
unsafe包中。它们完成了用于实现无关的切片和字符串操作的函数集。 - Go 的类型转换规则已扩展,允许直接从切片转换为数组。
- 语言规范现在定义了比较数组元素和结构体字段的精确顺序。这澄清了在比较过程中发生 panic 时的情况。
工具改进
cover工具现在可以收集整个程序的覆盖率剖析信息,而不仅仅是单元测试。go工具不再依赖于 `$GOROOT/pkg` 目录中预编译的标准库包归档文件,并且这些文件不再随发行版一起提供,从而减小了下载大小。相反,标准库中的包会根据需要进行构建并缓存在构建缓存中,与其他包一样。- 改进了 `go test -json` 的实现,使其在标准输出出现意外写入时更加健壮。
go build、go install以及其他与构建相关的命令现在接受 `-pgo` 标志,以启用 Profile-Guided Optimization,以及一个用于整个程序覆盖率分析的 `-cover` 标志。- 在没有 C 工具链的系统上,`go` 命令现在默认禁用 `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` 字段 `Cancel` 和 `WaitDelay` 指定了 `Cmd` 在其关联的 `Context` 被取消或其进程退出时的行为。
性能改进
- 编译器和垃圾回收器的改进减少了内存开销,并将整体 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 为 FreeBSD on RISC-V 增加了实验性支持。
有关所有更改的完整且更详细的列表,请参阅 完整发行说明。
感谢所有通过编写代码、提交 bug、分享反馈和测试候选版本为本次发布做出贡献的人。您的努力有助于确保 Go 1.20 尽可能稳定。一如既往,如果您发现任何问题,请 提交 issue。
享受 Go 1.20!
下一篇文章:Profile-Guided Optimization 预览
上一篇文章:分享您关于 Go 开发的反馈
博客索引