Go 語言十五周年!權(quán)力交接、回顧與展望
大家好,我是煎魚。
2024 年 11 月 11 日,Go 語言迎來了它的 15 歲生日。自 2009 年開源發(fā)布以來,Go 語言以其穩(wěn)定性、安全性和對(duì)大規(guī)模軟件工程的支持而聞名。
本文將回顧 Go 語言的發(fā)展歷程,探討其最新特性,并展望 Go 語言的未來。
Go 語言的快速增長(zhǎng)
在過去的五年中,Go 的用戶基數(shù)增長(zhǎng)了三倍多,成為增長(zhǎng)最快的編程語言之一。
Go 語言不僅躋身于十大編程語言之列,更成為現(xiàn)代云計(jì)算的首選語言。
Go 1.22 和 Go 1.23 的新特性
for 循環(huán)的變革
Go 1.22 和 Go 1.23 的發(fā)布標(biāo)志著 for 循環(huán)的重大變革。
Go 1.22 引入了變量作用域的變更,使得 for 循環(huán)中引入的變量作用域?yàn)槊看蔚?,而非整個(gè)循環(huán),解決了長(zhǎng)期存在的語言 “陷阱”。
如下代碼:
for i := 0; i < 5; i++ {
go func() {
fmt.Println(i)
}()
}
在 Go 1.22 之前,這會(huì)打印最后 i 的值 5 次;現(xiàn)在會(huì)打印出 0 到 4 的數(shù)值。
這一決策的背后是 Go 團(tuán)隊(duì)對(duì)歷史決策的反思和社區(qū)反饋的重視。
向前兼容的語言特性
這些變革得以實(shí)現(xiàn),得益于 Go 1.21 引入的向前語言兼容性。
這一特性建立在 Go 模塊的基礎(chǔ)上,Go 模塊自 Go 1.14 引入以來,已經(jīng)過去了四年半。
迭代器和用戶定義的 for-range 循環(huán)
Go 1.23 在此基礎(chǔ)上進(jìn)一步引入了迭代器和用戶定義的 for-range 循環(huán)。
迭代器的代碼例子:
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{"腦子", "進(jìn)", "煎魚", "了"}
for i, s := range Backward(sl) {
fmt.Printf("%d: %s\n", i, s)
}
}
結(jié)合 Go 1.18 引入的泛型,這為自定義集合和其他編程模式提供了強(qiáng)大而便捷的基礎(chǔ)。
各項(xiàng)特效的功能增強(qiáng)
這些版本還帶來了許多生產(chǎn)就緒性的提升,帶來了非常大的提升。
例如,標(biāo)準(zhǔn)庫 net/http 的 HTTP ServerMux 的功能增強(qiáng):
mux.HandleFunc("POST /eddycjy/create", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "腦子進(jìn)煎魚了!")
})
mux.HandleFunc("GET /eddycjy/update", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "煎魚進(jìn)腦子了...")
})
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 執(zhí)行追蹤的全面改革,以及為所有 Go 應(yīng)用程序提供更強(qiáng)的隨機(jī)性的新包 math/rand/v2。
此外,首個(gè) v2 標(biāo)準(zhǔn)庫包的引入為未來庫的演變和現(xiàn)代化樹立了新的 v2 模板。(后面要搞 encoding/json/v2,值得期待?。?/p>
Go 工具的遙測(cè)
過去一年,Go 團(tuán)隊(duì)謹(jǐn)慎推出了 Go 工具 Gotelemetry 的可選遙測(cè)系統(tǒng)。
這一系統(tǒng)將為 Go 開發(fā)者提供數(shù)據(jù),幫助他們做出更好的決策,同時(shí)保持完全開放和匿名。
圖片
Go 遙測(cè)首先出現(xiàn)在 gopls 中,已經(jīng)帶來了許多改進(jìn)。
未來的發(fā)展方向
硬件適應(yīng)性
Go 團(tuán)隊(duì)正在進(jìn)化 Go 語言,以更好地利用當(dāng)前和未來的硬件能力。
為了確保 Go 在未來 15 年繼續(xù)支持高性能、大規(guī)模的生產(chǎn)工作負(fù)載,Go 需要適應(yīng)大型多核、高級(jí)指令集以及在日益非均勻的內(nèi)存層次結(jié)構(gòu)中局部性的重要性。
新的 map 實(shí)現(xiàn)
Go 1.24 將有一個(gè)全新的 map 實(shí)現(xiàn),它在現(xiàn)代 CPU 上更高效。
同時(shí),Go 團(tuán)隊(duì)正在原型設(shè)計(jì)新的垃圾回收算法(就是上次說到新任負(fù)責(zé)人去日本喝抹茶,結(jié)果想出來個(gè)抹茶新算法)。
這些新算法將基于現(xiàn)代硬件的能力和限制會(huì)進(jìn)行調(diào)整,給 Go 帶來更大的效益。
新 API 和工具
一些改進(jìn)將以新 API 和工具的形式出現(xiàn),以便 Go 開發(fā)者更好地利用現(xiàn)代硬件。
Go 團(tuán)隊(duì)正在研究如何支持最新的向量和矩陣硬件指令,以及應(yīng)用程序如何構(gòu)建 CPU 和內(nèi)存局部性。
可組合優(yōu)化
指導(dǎo)這些努力的核心原則是可組合優(yōu)化:優(yōu)化對(duì)代碼庫的影響應(yīng)盡可能局部化。
確保代碼庫其余部分的開發(fā)簡(jiǎn)便性不受影響。
安全性
Go 團(tuán)隊(duì)繼續(xù)確保 Go 的標(biāo)準(zhǔn)庫默認(rèn)安全、設(shè)計(jì)安全。
圖片
這包括持續(xù)努力將 FIPS 認(rèn)證的加密支持內(nèi)置到 Go 中,使得需要 FIPS 加密的應(yīng)用程序只需切換一個(gè)標(biāo)志即可。
AI 與 Go
Go 團(tuán)隊(duì)正在通過增強(qiáng) Go 在 AI 基礎(chǔ)設(shè)施、應(yīng)用程序和開發(fā)者輔助方面的能力,使 Go 更好地服務(wù)于 AI,同時(shí)也使 AI 更好地服務(wù)于 Go。
Go 作為構(gòu)建生產(chǎn)系統(tǒng)的可靠語言,Go 團(tuán)隊(duì)希望它也能成為構(gòu)建生產(chǎn) AI 系統(tǒng)的可靠語言。
圖片
Gabyhelp
Oscar
Go 在云基礎(chǔ)設(shè)施中的可靠性使其成為 LLM 基礎(chǔ)設(shè)施的自然選擇。
對(duì)于 AI 應(yīng)用程序,Go 團(tuán)隊(duì)將繼續(xù)在流行的 AI SDK(LangChainGo 和 Genkit) 中為 Go 提供一流的支持。