大家好,我是煎鱼。
2024 年 11 月 11 日,Go 语言迎来了它的 15 岁生日。自 2009 年开源发布以来,Go 语言以其稳定性、安全性和对大规模软件工程的支持而闻名。
本文将回顾 Go 语言的发展历程,探讨其最新特性,并展望 Go 语言的未来。
在过去的五年中,Go 的用户基数增长了三倍多,成为增长最快的编程语言之一。
Go 语言不仅跻身于十大编程语言之列,更成为现代云计算的首选语言。
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 引入以来,已经过去了四年半。
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 工具 Gotelemetry 的可选遥测系统。
这一系统将为 Go 开发者提供数据,帮助他们做出更好的决策,同时保持完全开放和匿名。
因篇幅问题不能全部显示,请点此查看更多更全内容