虽然迟到了,但绝不缺席!新任Go技术负责人Austin Clements在Go语言15岁生日后的第二天,在Go官方博客上发表了庆祝文章“Go Turns 15[2]”。在这篇文章中,Austin回顾了过去一年Go项目和社区的变化,以及Go团队的努力工作,并对Go的未来发展进行了展望。我在此对这篇庆生文进行了翻译,供大家参考。
Go,生日快乐!
周日,我们庆祝了Go开源15周年[3]!自从Go诞生10周年[4]以来,无论是Go语言本身还是整个世界都经历了巨大的变化。尽管如此,有些方面依然保持不变:Go始终致力于稳定性、安全性,以及支持软件工程和大规模生产。Go语言发展势头强劲!在过去五年中,Go的用户群增加了三倍多(译注:不知道这个数据从何而来),成为增长最快的编程语言之一。自十五年前诞生以来,Go已成为十大编程语言。
上图.来自TIOBE 2024年11月排行榜(译者配图)
上图.来自Github Octoverse 2024(译者配图)
随着Go 1.22版本在二月份发布和Go 1.23版本在八月份发布,这一年可被称为“for循环之年”。Go 1.22将for循环中引入变量的作用域改为每次迭代[8],而非整个循环,从而解决了一个长期存在的语言“陷阱”。十多年前,在Go 1发布之前,Go团队对几个语言细节做出了决策,其中就包括for循环是否应该在每次迭代中创建一个新的循环变量。有趣的是,这次讨论非常简短且没有明确的意见。Rob Pike以他一贯的风格结束了讨论,只说了一个字:“stet”(保持原样)。结果也确实如此。尽管当时看似微不足道,但多年的生产经验突显了这一决策的影响。然而,在此期间,我们还构建了强大的工具来理解对Go的变更影响,特别是在整个Google代码库中进行生态系统范围的分析和测试,并建立了与社区合作和获取反馈的流程。在经过广泛的测试、分析和社区讨论后,我们推出了这一变更,并配备了哈希二分工具[9],以帮助开发者在大规模代码中精确定位受影响的部分。
对for循环的变更仅是是五年演进调整的一部分。这一变更的实现得益于Go 1.21中引入的向前兼容性,而这又建立在四年半前Go 1.14[11]发布的Go模块[12]基础之上。
译注:Go module首次在Go 1.11版本由Russ Cox设计和实现,Go 1.14版本首次宣布Go module具备生产使用的成熟度了。
Go 1.23在此变更的基础上进一步引入了迭代器和用户定义的for-range循环。结合仅仅两年半前在Go 1.18中引入的泛型!——这为自定义集合和许多其他编程模式奠定了强大而人性化的基础。
这些版本还带来了许多生产就绪方面的改进,包括备受期待的标准库HTTP路由器增强[14]、执行跟踪的全面重构[15],以及为所有Go应用程序提供更强的随机性[16]。此外,我们的第一个v2标准库包[17]的引入为未来的标准库演进和现代化建立了模板。
在过去的一年中,我们还谨慎地推出了Go工具的自愿使用的遥测系统和匿名。Go遥测最初出现在gopls(Go语言服务器)中,已经带来了许多改进[19]。这项努力为使Go编程体验变得更加出色奠定了基础。
展望未来,我们正在不断演进Go,以更好地利用当前和未来硬件的能力。在过去的15年中,硬件发生了巨大的变化。为了确保Go能够在接下来的15年中继续支持高性能、大规模的生产工作负载,我们需要适应大型多核处理器、先进的指令集,以及在non-uniform内存层次结构中日益重要的局部性。其中一些改进将是透明的。Go 1.24将推出全新底层实现的map,以提高在现代CPU上的执行效率。同时,我们正在进行新的垃圾回收算法的原型设计,以适应现代硬件的能力和限制。一些改进将以新的API和工具的形式出现,以便Go开发者更好地利用现代硬件。我们正在研究如何支持最新的向量和矩阵硬件指令,以及应用程序如何构建CPU和内存的局部性。指导我们努力的一个核心原则是**可组合优化(composable optimization)**:优化对代码库的影响应该尽可能局部化,以确保对其余代码库开发的便捷性不受影响。
我们将继续确保Go的标准库在默认情况下是安全的,并在设计上也考虑到安全性。这包括不断努力将内置的、原生支持的FIPS认证加密功能纳入其中,使得需要FIPS加密的应用程序只需简单切换一个命令行标志即可使用。此外,我们还在不断改进Go的标准库包,并借鉴math/rand/v2的例子,考虑在哪里可以引入新的API,以显著提高编写安全和可靠的Go代码的便利性。
我们正在努力使Go在人工智能领域表现更好,同时也让人工智能更好地服务于Go,增强其在AI基础设施、应用程序和开发者辅助工具方面的能力。Go是一种非常适合构建生产系统的语言,我们希望它也能成为构建生产级AI系统[20]的优秀语言。作为云基础设施的可靠语言,Go自然成为大型语言模型(LLM)基础设施[21]的理想选择。针对AI应用,我们将继续在流行的AI SDK中为Go提供一流的支持,包括LangChainGo[22]和Genkit[23]。从一开始,Go就旨在改善端到端的软件工程过程,因此我们自然希望引入AI的最新工具和技术,以减少开发者的重复劳动,从而留出更多时间来进行更有趣的编程活动!
感谢您!
所有这一切的实现都离不开Go的杰出贡献者和蓬勃发展的社区。十五年前,我们只能憧憬Go所取得的成功以及围绕Go发展起来的社区。感谢每一位参与其中的人,无论贡献大小。我们祝愿大家在新的一年里一切顺利!
参考资料
[1] 新任Go技术负责人Austin Clements: https://tonybai.com/2024/10/10/pass-torch-to-go-new-leadership-team/
[2] Go Turns 15: https://go.dev/blog/15years
[3] Go开源15周年: https://opensource.googleblog.com/2009/11/hey-ho-lets-go.html
[4] Go诞生10周年: https://go.dev/blog/10years
[5] Go已成为十大编程语言: https://mp.weixin.qq.com/s?__biz=MzIyNzM0MDk0Mg==&mid=2247497403&idx=1&sn=03bc972e38163e1539da765249d46586&chksm=e860115adf17984cfe47f9680d8c0fb6370987ad45415ff2d38233d05fe6b315210ce6ada385#rd
[6] Go 1.22版本: https://tonybai.com/2024/02/18/some-changes-in-go-1-22/
[7] Go 1.23版本: https://tonybai.com/2024/08/19/some-changes-in-go-1-23/
[8] 改为每次迭代: https://go.dev/blog/loopvar-preview
[9] 哈希二分工具: https://go.googlesource.com/proposal/+/master/design/60078-loopvar.md#transition-support-tooling
[10] Go 1.21中引入的向前兼容性: https://tonybai.com/2023/09/10/understand-go-forward-compatibility-and-toolchain-rule/
[11] Go 1.14: https://tonybai.com/2020/03/08/some-changes-in-go-1-14/
[12] Go模块: https://tonybai.com/tag/gomodule
[13] 迭代器和用户定义的for-range循环: https://tonybai.com/2024/06/24/range-over-func-and-package-iter-in-go-1-23/
[14] 标准库HTTP路由器增强: https://go.dev/blog/routing-enhancements
[15] 执行跟踪的全面重构: https://go.dev/blog/execution-traces-2024
[16] 为所有Go应用程序提供更强的随机性: https://go.dev/blog/chacha8rand
[17] 第一个v2标准库包: https://go.dev/blog/randv2
[18] 自愿使用的遥测系统: https://mp.weixin.qq.com/s?__biz=MzIyNzM0MDk0Mg==&mid=2247497282&idx=1&sn=30e10a7091c270d5dcd5e1b3c57bdf2c&chksm=e86011a3df1798b57870fedccbbda20d0a334413e15c768476a18fe9446a89432e776a8fbf1c#rd
[19] 许多改进: https://github.com/golang/go/issues?q=is%3Aissue+label%3Agopls%2Ftelemetry-wins
[20] 构建生产级AI系统: https://go.dev/blog/llmpowered
[21] 大型语言模型(LLM)基础设施: https://ollama.com/
[22] LangChainGo: https://pkg.go.dev/github.com/tmc/langchaingo
[23] Genkit: https://developers.googleblog.com/en/introducing-genkit-for-go-build-scalable-ai-powered-apps-in-go/