Go 的 14 岁

meta

正文

今天我们庆祝 Go 开源代码发布已经 14 年了,Go 通过两个功能齐全和其他重要的里程碑发布度过了这美好的一年

我们在一月发布了 Go 1.20 并且在八月发布了 Go 1.21。更多的关注了增强实现而不是语言的改进。

配置文件引导 (PGO) 在 Go 1.20 预览版 中发布并在 Go 1.21 正式版 发布了。允许 Go 编译器读取项目中的配置文件并且花更多的时间优化代码中最常运行的部分。在 Go 1.21 中,启用了 PGO 通常能够提升 2%-7% 的 CPU 工作负载。参阅 “Profile-guided optimization in Go 1.21” 查看概览和 “profile-guided optimization user guide” 查看详细文档

Go 1.2 开始就提供了支持在测试过程中收集覆盖率的配置文件。在 Go 1.20 添加了在 go build 构建二进制文件中收集测试覆盖率的支持,允许你能够更方便的在大型集成测试中收集覆盖率。参阅 “Code coverage for Go integration tests

Go 1 和未来的 Go 程序 开始,兼容性就是非常重要的一部分。Go 通过扩展我们需要更改的情况下使用 GODEBUG 的使用规则,进一步提高了兼容性,例如必须修改但可能破坏现有程序的重要 bug 修复。参阅 “Backward Compatibility, Go 1.21, and Go 2” 查看概览和 “Go, Backwards Compatibility, and GODEBUG” 查看详细文档

Go 1.21 还提供了对内置工具链管理的支持,允许你像更改其他依赖项版本一样容易的修改特定模块中使用的 Go 工具链版本。参阅博客 “Forward Compatibility and Toolchain Management in Go 1.21” 查看概览和文档 “Go Toolchains” 查看详细文档

另一个重要工具的实现是将磁盘索引集成到了 Go 的 LSP 服务 gopls 中。在典型的例子中,gopls 的启动等待和内存占用减少了 3-5 倍。“Scaling gopls for the growing Go ecosystem” 解释了技术细节。你应该通过运行以下命令来确保你正在使用最新的 gopls:

1
go install golang.org/x/tools/gopls@latest

Go 1.21 引入了新的 cmpmapsslices 包 - Go 的第一个通用标准库 - 以及扩展了可比较类型的集合。有关详细信息,请参阅博客 “All your comparable types”。

总而言之,我们持续的完善泛型并进行演讲和博客文章来解释重要的细节。今年两篇值得注意的文章是 “Deconstructing Type Parameters” 和 “Everything You Always Wanted to Know About Type Inference – And a Little Bit More”。

Go 1.21 中另一个重要的新包是 [log/slog](https://go.dev/pkg/log/slog/) ,它为标准库添加了结构化日志的官方 API。有关概述参阅 “Structured logging with slog”。

对于 WebAssembly (Wasm) 端口,Go 1.21 发布了对 WebAssembly 系统接口 (WASI) 预览版 1 的支持。WASI 预览版 1 是 Wasm 的新的“操作系统”接口,被大多数服务器端 Wasm 环境支持。参阅 “WASI support in Go” 查看演示。

在安全方面,我们继续确保 Go 在帮助开发者理解依赖项和漏洞方面处于领先地位, Govulncheck 1.0 在七月发布 。如果你使用 VS Code,你可以直接在编辑器中使用 Go 扩展运行 govulncheck:参阅 本教程 开始。如果你使用 GitHub,你可以在 CI/CD 中使用 govulncheck,使用 GitHub Action for govulncheck 。有关检查依赖项漏洞问题的更多信息,请参阅今年的 Google I/O 演讲 “Build more secure apps with Go and Google”。

另一个重要的安全里程碑是 Go 1.21 高度重视可重现工具链。参阅 “Perfectly Reproducible, Verified Go Toolchains” 查看详细信息,包括在 Mac 上不使用任何 Linux 工具就能够复现 Ubuntu Linux Go 工具链的演示。

这真是忙碌的一年呀!

在 Go 的第 15 年,我们仍将继续努力使 Go 成为最好的软件工程环境。我们特别兴奋的一件事是重新定义 for 循环的 := 语义以消除意外的别名 bug。参阅 “Fixing For Loops in Go 1.22” 查看详细信息,包括在 Go 1.21 中预览此更改的说明。

致谢

Go 项目能够一直前进不仅仅是靠 Google 公司的 Go 团队,感谢所有做过贡献的人和社区中讨论的每一个你,是你们让 Go 变成了今天的样子。祝你们新的一年一切顺利。