今年二月我们发布了 Go 1.20 版本,八月发布了 Go 1.21 版本,这两个版本更加注重实现的改进,而不是新增语言功能。
其中一个重要的新功能是 Profile-guided optimization (PGO),在 Go 1.20 中进行了预览,并在 Go 1.21 中正式发布。PGO 允许 Go 编译器读取程序的性能剖析数据,从而更好地优化频繁执行的部分。在 Go 1.21 中,启用 PGO 可以使工作负载的 CPU 使用率提高 2% 到 7%。详细信息请参阅《Go 1.21 中的 Profile-guided optimization》和《Profile-guided optimization 用户指南》。
自从 Go 1.2 版本以来,Go 提供了对 go test 的代码覆盖率分析支持。Go 1.20 版本增加了在由 go build 构建的二进制文件中收集代码覆盖率的支持,这使得我们可以在更大的集成测试中进行代码覆盖率分析。详细信息请参阅《Go 集成测试的代码覆盖率》。
自从《Go 1 和 Go 程序的未来》以来,兼容性一直是 Go 的重要特性。Go 1.21 版本通过扩展 GODEBUG 的用法约定,进一步改善了兼容性,以便在必须允许更改(如重要的错误修复)但可能破坏现有程序的情况下进行更改。详细信息请参阅博文《向后兼容性 Go 1.21 和 Go 2》和文档《Go 向后兼容性和 GODEBUG》。
Go 1.21 版本还引入了内置工具链管理支持,使你可以像更改其他依赖项的版本一样轻松更改特定模块中使用的 Go 工具链的版本。详细信息请参阅博文《Go 1.21 中的向前兼容性和工具链管理》和文档《Go 工具链》。
另一个重要的工具改进是将磁盘索引集成到 gopls(Go LSP 服务器)中。这样一来,gopls 在典型的使用场景中的启动延迟和内存使用率都可以减少 3-5 倍。《为不断增长的 Go 生态系统优化 gopls》解释了技术细节。你可以通过运行以下命令来确保你正在运行最新的 gopls:
go install golang.org/x/tools/gopls@latest
Go 1.21 版本引入了新的 cmp、maps 和 slices 包,这是 Go 的第一个通用标准库。此外,还扩展了可比较类型的集合。详细信息请参阅博文《你的所有可比较类型》。
总体而言,我们继续改进泛型并撰写演讲和博文,以解释重要细节。今年两篇值得注意的博文是《拆解类型参数》和《关于类型推断,你一直想知道的一切——以及更多》。
Go 1.21 版本中的另一个重要新功能是 log/slog 包,它为标准库添加了官方的结构化日志记录 API。详细信息请参阅《使用 slog 进行结构化日志记录》。
对于 WebAssembly(Wasm)端口,Go 1.21 版本支持在 WebAssembly System Interface (WASI) preview 1 上运行。WASI preview 1 是一个新的 Wasm “操作系统”接口,被大多数服务器端 Wasm 环境支持。详细信息请参阅《Go 中的 WASI 支持》。
在安全方面,我们继续努力确保 Go 在帮助开发人员了解其依赖关系和漏洞方面处于领先地位,Govulncheck 1.0 在七月份发布。如果你使用 VS Code,你可以使用 Go 扩展直接在编辑器中运行 govulncheck:请参阅本教程开始使用。如果你使用 GitHub,你可以在 CI/CD 中使用 govulncheck 的 GitHub Action 运行。有关检查依赖项的漏洞问题的更多信息,请参阅今年的 Google I/O 演讲《使用 Go 和 Google 构建更安全的应用程序》。
另一个重要的安全里程碑是 Go 1.21 的高度可复现的工具链构建。详细信息请参阅《完全可复现、经过验证的 Go 工具链》。其中演示了在 Mac 上无需使用任何 Linux 工具,实现在 Ubuntu Linux 上复现 Go 工具链的过程。
这是一个忙碌的一年!
在 Go 迈入第十五个年头时,我们将继续努力使 Go 成为最适合规模化软件工程的环境。我们特别期待的一项改变是重新定义 for loop := 语义,以消除意外的别名错误。详细信息请参阅博文《修复 Go 1.22 中的 for 循环》。
感谢你们的支持! Go 项目一直远远超出了 Google Go 团队的范畴。感谢所有贡献者和 Go 社区的每一个人,正是因为你们,Go 才有了今天的成就。祝愿大家在未来的一年里一切顺利。
参考资料
Go 1.21 中的 Profile-guided optimization:https://go.dev/blog/pgo
Profile-guided optimization 用户指南:https://go.dev/doc/pgo
Go 集成测试的代码覆盖率:https://go.dev/blog/integration-test-coverage
向后兼容性 Go 1.21 和 Go 2:https://go.dev/blog/compat
Go 向后兼容性和 GODEBUG:https://go.dev/doc/godebug
Go 1.21 中的向前兼容性和工具链管理:https://go.dev/blog/toolchain
Go 工具链:https://go.dev/doc/toolchain
为不断增长的 Go 生态系统优化 gopls:https://go.dev/blog/gopls-scalability
你的所有可比较类型:https://go.dev/blog/comparable
拆解类型参数:https://go.dev/blog/deconstructing-type-parameters
关于类型推断,你一直想知道的一切——以及更多:https://go.dev/blog/type-inference
使用 slog 进行结构化日志记录:https://go.dev/blog/slog
Go 中的 WASI 支持:https://go.dev/blog/wasi
使用 Go 和 Google 构建更安全的应用程序:https://www.youtube.com/watch?v=HSt6FhsPT8c&ab_channel=TheGoProgrammingLanguage
完全可复现、经过验证的 Go 工具链:https://go.dev/blog/rebuild
修复 Go 1.22 中的 for 循环:https://go.dev/blog/loopvar-preview