Go 部落格

Go 1.22 釋出了!

Eli Bendersky,代表 Go 團隊
2024 年 2 月 6 日

今天,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 開發方面的反饋
部落格索引