Go,14 周年
国内的双十一购物狂欢已没有了当年的那种热闹与喧嚣,但大洋彼岸的 Go 团队却始终保持稳中有增的开发和语言演进节奏。今晨 Go 核心团队的Russ Cox代表 Go 语言项目团队在 Go 官博上发表了《Fourteen Years of Go》的博文,纪念Go语言开源14周年,并对 2023 年以来 Go 语言的演进进行了归纳总结,并对 Go 在其第 15 个年头将要做的改进给予了很高的期望。这里对博文做简单翻译,供大家参考。
今天,我们欢庆Go语言开源发布十四周年!Go 在过去一年中取得了巨大的进步,发布了两个功能特性丰富的版本,并达成了其他一些重要的里程碑。
我们在 2 月发布了Go 1.20,在 8 月发布了Go 1.21,在这两个版本中,我们更多地关注实现改进而不是新语言特性。
我们在Go 1.20版本中发布了Profile-guided optimization(PGO)功能的预览版,并在Go 1.21中正式发布了该功能,它允许 Go 编译器读取程序的 Profile,然后花更多时间对程序中运行最频繁的部分进行优化。在 Go 1.21 中,启用 PGO 后,工作负载的 CPU 使用率通常可以提高 2%到 7%。关于 PGO 的介绍请参阅“Go 1.21中的Profile-guided optimization”,对 PGO 的全面说明请参阅“PGO用户指南”。
Go从Go 1.2版本开始就支持在 go test 期间收集覆盖率 profile 数据。Go 1.20 版本增加了对 go build 构建的二进制文件收集测试覆盖率 profile 数据的支持,这样你就可以在集成测试期间收集测试覆盖率数据,详情请参阅“Go集成测试的代码覆盖率”。
兼容性一直是Go的重要组成部分,我们最初对兼容性的承诺始于“Go 1和Go程序的未来”这篇文章。针对那些可能会给现有程序造成破坏但又必须要修正的重要错误,Go 1.21 版本通过扩展 GODEBUG 的约定用法进一步改进了兼容性。请参阅博文“后向兼容性,Go 1.21和Go 2”了解概况,详情请参阅文档“Go、后向兼容性和GODEBUG”。
Go 1.21 还发布了对内置工具链管理的支持,允许你像改变其他依赖的版本一样轻松地改变特定模块(module)中使用的 Go 工具链版本。请参阅博文“Go 1.21中的向前兼容性和工具链管理”,更多详情请参阅文档“Go工具链”。
另一个在工具链方面的重要成就是将磁盘索引集成到 gopls(Go 语言服务器)。这将 gopls 的启动延迟和内存使用缩短了 3-5 倍。“扩展gopls以适应不断增长的Go生态系统”一文解释了其中的技术细节。你可以通过运行以下命令确保运行最新的 gopls:
Go 1.21 引入了新的cmp、maps和slices包 —— Go 的第一个泛型标准库 —— 以及扩展了可比较类型(comparable)的集合。详情请参阅博文“所有可比较的类型”。
总体而言,我们继续完善泛型,并通过会议演讲和撰写博文来解释重要细节。今年两篇值得关注的博文是“分解类型参数”和“关于类型推断你一直想知道的事情 —— 以及更多”。
Go 1.21 中另一个重要的新包是log/slog,它为标准库添加了结构化日志的官方 API。请参阅“使用slog实现结构化日志”了解概况。
在对 WebAssembly(Wasm)的移植方面,Go 1.21 增加了在 WebAssembly System Interface(WASI) preview1 版本上运行的支持。WASI preview1 是一种新的“操作系统”接口,支持大多数服务器端的 Wasm 环境。详情请参阅“Go对WASI的支持”一文。
在安全方面,我们将继续确保 Go 在帮助开发人员了解其依赖关系和漏洞方面处于领先地位,7 月发布的Govulncheck 1.0正是这样的例子。如果你使用 VS Code,可以通过 Go 扩展直接在编辑器中运行 govulncheck。请参阅govulncheck IDE教程了解如何开始使用 govulncheck。如果你使用 GitHub,可以使用GitHub Action for govulncheck将运行 govulncheck 作为 CI/CD 流程的一部分。有关检查依赖项漏洞问题的更多信息,请参阅今年的 Google I/O 大会的演讲“使用Go和Google构建更安全的应用程序”。
另一个重要的安全里程碑是 Go 1.21 的高度可重现的工具链构建。详情请参阅“完全可重现的经验证的Go工具链”,包括在没有使用任何 Linux 工具的情况下在 Mac 上重现 Ubuntu Linux Go 工具链的演示。
这是非常繁忙的一年!
在 Go 的第 15 个年头,我们将继续努力使 Go 成为最佳的大规模软件工程环境。我们特别兴奋的一个变化是重新定义 for 循环中":="的语义,以消除意外别名 bug 的可能性。详情请参阅“在Go 1.22中修复For循环”,其中包括在 Go 1.21 中对此更改的预览版的说明。
感谢!
Go 项目一直远不止我们在 Google 的 Go 小组。感谢所有贡献者和 Go 社区中的每一个人,使得今天的 Go 成为可能。我们衷心祝愿大家在未来一年中一切顺利。
评论