2024 年 11 月 11 日,Go 语言迎来了它的 15 岁生日。自 2009 年开源发布以来,Go 语言以其稳定性、安全性和对大规模软件工程的支持而闻名。
本文将回顾 Go 语言的发展历程,探讨其最新特性,并展望 Go 语言的未来。
Go 语言的快速增长
在过去的五年中,Go 的用户基数增长了三倍多,成为增长最快的编程语言之一。
Go 语言不仅跻身于十大编程语言之列,更成为现代云计算的首选语言。
Go 1.22 和 Go 1.23 的新特性
for 循环的变革
Go 1.22 和 Go 1.23 的发布标志着 for 循环的重大变革。
Go 1.22 引入了变量作用域的变更,使得 for 循环中引入的变量作用域为每次迭代,而非整个循环,解决了长期存在的语言 “陷阱”。
如下代码:
for i := 0; i < 5; i++ {
go func() {
fmt.Println(i)
}()
}
在 Go 1.22 之前,这会打印最后 i 的值 5 次;现在会打印出 0 到 4 的数值。
这一决策的背后是 Go 团队对历史决策的反思和社区反馈的重视。
向前兼容的语言特性
这些变革得以实现,得益于 Go 1.21 引入的向前语言兼容性。
这一特性建立在 Go 模块的基础上,Go 模块自 Go 1.14 引入以来,已经过去了四年半。
迭代器和用户定义的 for-range 循环
Go 1.23 在此基础上进一步引入了迭代器和用户定义的 for-range 循环。
迭代器的代码例子:
func Backward[E any](s []E) iter.Seq2[int, E] {
return func(yield func(int, E) bool) {
for i := len(s) - 1; i >= 0; i-- {
if !yield(i, s[i]) {
return
}
}
}
}
func main() {
sl := []string{"脑子", "进", "煎鱼", "了"}
for i, s := range Backward(sl) {
fmt.Printf("%d: %s\n", i, s)
}
}
结合 Go 1.18 引入的泛型,这为自定义集合和其他编程模式提供了强大而便捷的基础。
各项特效的功能增强
这些版本还带来了许多生产就绪性的提升,带来了非常大的提升。
例如,标准库 net/http 的 HTTP ServerMux 的功能增强:
mux.HandleFunc("POST /eddycjy/create", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "脑子进煎鱼了!")
})
mux.HandleFunc("GET /eddycjy/update", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "煎鱼进脑子了...")
})
mux.HandleFunc("/eddycjy/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
fmt.Fprintf(w, "id 值为 %s", id)
})
mux.HandleFunc("/eddycjy/{path...}", func(w http.ResponseWriter, r *http.Request) {
path := r.PathValue("path")
fmt.Fprintf(w, "path 值为 %s", path)
})
...
还有 Trace 执行追踪的全面改革,以及为所有 Go 应用程序提供更强的随机性的新包 math/rand/v2。
此外,首个 v2 标准库包的引入为未来库的演变和现代化树立了新的 v2 模板。(后面要搞 encoding/json/v2,值得期待!)
Go 工具的遥测
过去一年,Go 团队谨慎推出了 Go 工具 Gotelemetry 的可选遥测系统。
这一系统将为 Go 开发者提供数据,帮助他们做出更好的决策,同时保持完全开放和匿名。
图片
Go 遥测首先出现在 gopls 中,已经带来了许多改进。
未来的发展方向
硬件适应性
Go 团队正在进化 Go 语言,以更好地利用当前和未来的硬件能力。
为了确保 Go 在未来 15 年继续支持高性能、大规模的生产工作负载,Go 需要适应大型多核、高级指令集以及在日益非均匀的内存层次结构中局部性的重要性。
新的 map 实现
Go 1.24 将有一个全新的 map 实现,它在现代 CPU 上更高效。
同时,Go 团队正在原型设计新的垃圾回收算法(就是上次说到新任负责人去日本喝抹茶,结果想出来个抹茶新算法)。
这些新算法将基于现代硬件的能力和限制会进行调整,给 Go 带来更大的效益。
新 API 和工具
一些改进将以新 API 和工具的形式出现,以便 Go 开发者更好地利用现代硬件。
Go 团队正在研究如何支持最新的向量和矩阵硬件指令,以及应用程序如何构建 CPU 和内存局部性。
可组合优化
指导这些努力的核心原则是可组合优化:优化对代码库的影响应尽可能局部化。
确保代码库其余部分的开发简便性不受影响。
安全性
Go 团队继续确保 Go 的标准库默认安全、设计安全。
图片
这包括持续努力将 FIPS 认证的加密支持内置到 Go 中,使得需要 FIPS 加密的应用程序只需切换一个标志即可。
AI 与 Go
Go 团队正在通过增强 Go 在 AI 基础设施、应用程序和开发者辅助方面的能力,使 Go 更好地服务于 AI,同时也使 AI 更好地服务于 Go。
Go 作为构建生产系统的可靠语言,Go 团队希望它也能成为构建生产 AI 系统的可靠语言。
图片
Gabyhelp
Oscar
Go 在云基础设施中的可靠性使其成为 LLM 基础设施的自然选择。
对于 AI 应用程序,Go 团队将继续在流行的 AI SDK(LangChainGo 和 Genkit) 中为 Go 提供一流的支持。