今天我们庆祝Go开源十四周年!Go度过了美好的一年,发布了两个功能齐全的版本和其他重要的里程碑。
我们在2月份发布了Go 1.20,在8月份发布了Go 1.21,更多地关注实现改进而不是新的语言更改。
在Go 1.20中,我们预览了配置文件引导优化(PGO),并在Go 1.21中正式发布。PGO允许Go编译器读取程序的配置文件,然后花更多时间优化程序中最常运行的部分。在启用PGO后,Go 1.21中的工作负载的CPU使用率通常会提高2%到7%。有关概述,请参阅“Go 1.21中的配置文件引导优化”,有关完整文档,请参阅配置文件引导优化用户指南。
自从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 Toolchains”。
另一个重要的工具成就是将磁盘索引集成到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系统接口(WASI)预览版1上运行。WASI预览版1是Wasm的新“操作系统”界面,大多数服务器端Wasm环境都支持。请参阅“Go中的WASI支持”了解演练。
在安全方面,我们将继续确保Go在帮助开发人员了解其依赖项和漏洞方面处于领先地位,并于7月推出Govulncheck 1.0。如果您使用VS Code,则可以使用Go扩展直接在编辑器中运行govulncheck:请参阅本教程以开始使用。如果您使用GitHub,则可以使用govulncheck的GitHub Action将govulncheck作为CI/CD的一部分运行。有关检查依赖项是否存在漏洞问题的更多信息,请参阅今年的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成为今天的样子。我们祝愿您在新的一年里一切顺利。
GopherChina 2023上海站
快点击阅读原文报名吧~~