Go 博客
Go 语言十四周年
今天,我们庆祝 Go 开源发布十四周年!Go 今年取得了巨大的进步,发布了两个功能丰富的版本,并取得了其他重要的里程碑。
我们在 2 月份发布了 Go 1.20,并在 8 月份发布了 Go 1.21,更多地关注实现改进而不是新的语言更改。
配置文件引导优化 (PGO) 在 Go 1.20 中进行了预览,并在 Go 1.21 中发布,允许 Go 编译器读取程序的配置文件,然后花费更多时间优化程序中运行最频繁的部分。在 Go 1.21 中,启用 PGO 后,工作负载通常可以提高 2% 到 7% 的 CPU 使用率。请参阅“Go 1.21 中的配置文件引导优化”以获取概述,以及 配置文件引导优化用户指南以获取完整文档。
Go 自 Go 1.2 以来一直支持在 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 倍。“扩展 gopls 以适应不断增长的 Go 生态系统”解释了技术细节。您可以通过运行以下命令来确保您正在运行最新的 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 系统接口 (WASI) 预览版 1 上运行的支持。WASI 预览版 1 是一个新的 Wasm“操作系统”接口,大多数服务器端 Wasm 环境都支持它。请参阅“Go 中的 WASI 支持”以获取演练。
在安全方面,我们继续确保 Go 在帮助开发人员了解其依赖项和漏洞方面处于领先地位,Govulncheck 1.0 于 7 月发布。如果您使用 VS Code,则可以使用 Go 扩展在编辑器中直接运行 govulncheck:请参阅 本教程以开始使用。如果您使用 GitHub,则可以将 govulncheck 作为 CI/CD 的一部分运行,使用 govulncheck 的 GitHub Action。有关检查依赖项是否存在漏洞问题的更多信息,请参阅今年的 Google I/O 演讲“使用 Go 和 Google 构建更安全的应用程序”。
另一个重要的安全里程碑是 Go 1.21 的高度可重现的工具链构建。请参阅“完美可重现、经过验证的 Go 工具链”以获取详细信息,包括在 Mac 上重现 Ubuntu Linux Go 工具链而根本不使用任何 Linux 工具的演示。
今年非常忙碌!
在 Go 的第 15 个年头,我们将继续努力使 Go 成为大规模软件工程的最佳环境。我们特别期待的一项更改是重新定义 for 循环 :=
语义以消除意外别名错误的可能性。请参阅“修复 Go 1.22 中的 for 循环”以获取详细信息,包括在 Go 1.21 中预览此更改的说明。
感谢您!
Go 项目一直远不止 Google 的 Go 团队。感谢所有贡献者和 Go 社区中的每个人,使 Go 成为今天的样子。我们祝愿大家在新的一年里一切顺利。
下一篇文章:Go 开发者调查 2023 年下半年结果
上一篇文章:关于类型推断的一切——以及更多
博客索引