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
    }
}

如需瞭解有關此變更和有助於防止程式碼意外中斷的工具的更多資訊,請參閱較早的 迴圈變數部落格文章

第二個語言變更是在範圍內支援整數

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%,同時也能減少約 1% 的大多數 Go 程式的記憶體開銷。

在 Go 1.21 中,我們發布了 Go 編譯器的剖析引導最佳化 (PGO),此功能持續改進。1.22 中新增的最佳化之一是改進了的虛擬化解除,允許靜態調度更多介面方法呼叫。啟用 PGO 後,大多數程式將看到 2-14% 的改善。

增強標準函示庫

  • 一個新的 math/rand/v2 套件提供更乾淨、更一致的 API,並使用品質更高、更快速的偽亂數字產生演算法。有關更多詳細資訊,請參閱 建議

  • net/http.ServeMux 使用的樣式現在接受方法和萬用字元。

    例如,路由程式接受類似於 GET /task/{id}/ 的樣式,它僅與 GET 要求相符,並在可透過 Request 值存取的地圖中擷取 {id} 區段的值。

  • database/sql 中的新 Null[T] 類型提供一種掃描允許為 Null 的欄位的方法。

  • 在套件 slices 中新增 Concat 函式,用於串接多個任何類型的區段。


感謝所有透過撰寫程式碼和文件、提交錯誤、分享意見回饋和測試候選版本為此版本做出貢獻的人。您的努力協助確保 Go 1.22 盡可能穩定。一如往常,如果您發現任何問題,請 提交問題

享受 Go 1.22!

下一篇文章:Go 1.22 的路由增強
上一篇文章:分享您關於使用 Go 開發的意見回饋
部落格索引