Go 部落格
Go 1.22 釋出了!
今天,Go 團隊非常激動地釋出 Go 1.22,您可以訪問 下載頁面 進行獲取。
Go 1.22 包含多項重要的新功能和改進。以下是一些值得注意的變化;有關完整的列表,請參閱 釋出說明。
語言變更
長期存在的“for”迴圈陷阱,即迭代之間意外共享迴圈變數的問題現已得到解決。從 Go 1.22 開始,以下程式碼將按某種順序列印“a”、“b”和“c”。
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
有關此更改以及有助於防止程式碼意外中斷的工具的更多資訊,請參閱之前的 迴圈變數部落格文章。
第二個語言更改是支援對整數進行 range 迭代
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(10 - i)
}
fmt.Println("go1.22 has lift-off!")
}
此倒計時程式中 i 的值從 0 到 9(含)。有關更多詳細資訊,請參閱 規範。
效能改進
Go 執行時中的記憶體最佳化將 CPU 效能提高了 1-3%,同時還將大多數 Go 程式的記憶體開銷降低了約 1%。
在 Go 1.21 中,我們為 Go 編譯器 推出了 配置檔案引導最佳化 (PGO),此功能將繼續得到改進。1.22 版中新增的最佳化之一是改進了內聯展開,允許對更多介面方法呼叫進行靜態分派。啟用 PGO 後,大多數程式的效能將提高 2-14%。
標準庫新增
-
新的 math/rand/v2 包提供了一個更清晰、更一致的 API,並使用了更高質量、更快的偽隨機生成演算法。有關更多詳細資訊,請參閱 提案。
-
net/http.ServeMux 使用的路由模式現在支援方法和萬用字元。
例如,路由器接受像
GET /task/{id}/這樣的模式,它僅匹配GET請求,並將{id}段的值捕獲到一個可透過 Request 值訪問的對映中。 -
在 database/sql 中新增的
Null[T]型別提供了一種掃描可空列的方法。 -
在 slices 包中添加了一個
Concat函式,用於連線任何型別的多個切片。
感謝所有透過編寫程式碼和文件、報告 bug、分享反饋和測試釋出候選版本為本次釋出做出貢獻的各位。你們的努力確保了 Go 1.22 儘可能穩定。一如既往,如果您發現任何問題,請 提交 issue。
盡情享受 Go 1.22 吧!
下一篇文章:Go 1.22 的路由增強
上一篇文章:分享您在 Go 開發方面的反饋
部落格索引