Go 部落格

Go 1.20 釋出!

Robert Griesemer 代表 Go 團隊
2023 年 2 月 1 日

今天,Go 團隊很高興地釋出 Go 1.20,您可以透過訪問 下載頁面 來獲取它。

Go 1.20 受益於一個更長的開發週期,這得益於更早的廣泛測試以及程式碼庫整體穩定性的提高。

我們特別高興地推出了 Profile-Guided Optimization (PGO) 的預覽版,它使編譯器能夠基於執行時剖析資訊執行特定於應用程式和工作負載的最佳化。為 go build 提供剖析資訊可以使編譯器將典型應用程式的速度提高約 3-4%,我們預計未來的版本將從 PGO 中受益更多。由於這是 PGO 支援的預覽版本,我們鼓勵大家嘗試一下,但仍有一些不完善之處,可能會妨礙生產環境的使用。

Go 1.20 還包含了一些語言變更、許多工具和庫的改進,以及整體效能的提升。

語言變更

  • 預宣告的 comparable 約束現在也能被普通的 可比較型別(例如介面)滿足,這將簡化泛型程式碼。
  • 已將 `SliceData`、`String` 和 `StringData` 函式新增到 unsafe 包中。它們完成了用於實現無關的切片和字串操作的函式集。
  • Go 的型別轉換規則已擴充套件,允許直接從切片轉換為陣列。
  • 語言規範現在定義了比較陣列元素和結構體欄位的精確順序。這澄清了在比較過程中發生 panic 時的情況。

工具改進

  • cover 工具現在可以收集整個程式的覆蓋率剖析資訊,而不僅僅是單元測試。
  • go 工具不再依賴於 `$GOROOT/pkg` 目錄中預編譯的標準庫包歸檔檔案,並且這些檔案不再隨發行版一起提供,從而減小了下載大小。相反,標準庫中的包會根據需要進行構建並快取在構建快取中,與其他包一樣。
  • 改進了 `go test -json` 的實現,使其在標準輸出出現意外寫入時更加健壯。
  • go buildgo install 以及其他與構建相關的命令現在接受 `-pgo` 標誌,以啟用 Profile-Guided Optimization,以及一個用於整個程式覆蓋率分析的 `-cover` 標誌。
  • 在沒有 C 工具鏈的系統上,`go` 命令現在預設停用 `cgo`。因此,當 Go 安裝在沒有 C 編譯器的系統上時,它現在將對可選使用 cgo 的標準庫中的包使用純 Go 構建,而不是使用預分發的包歸檔檔案(如上所述,這些檔案已被移除)。
  • vet 工具可以報告在並行執行的測試中可能發生的更多迴圈變數引用錯誤。

標準庫新增

  • 新的 crypto/ecdh 包為 NIST 曲線和 Curve25519 上的橢圓曲線 Diffie-Hellman 金鑰交換提供了顯式支援。
  • 新的 `errors.Join` 函式返回一個包裝了錯誤列表的錯誤,如果錯誤型別實現了 `Unwrap() []error` 方法,這些錯誤可以再次獲取。
  • 新的 `http.ResponseController` 型別提供了對 `http.ResponseWriter` 介面未處理的擴充套件的每個請求功能的訪問。
  • 轉發代理 `httputil.ReverseProxy` 包括一個新的 `Rewrite` 鉤子函式,取代了先前的 `Director` 鉤子。
  • 新的 `context.WithCancelCause` 函式提供了一種透過給定錯誤來取消上下文的方法。該錯誤可以透過呼叫新的 `context.Cause` 函式來檢索。
  • 新的 `os/exec.Cmd` 欄位 `Cancel` 和 `WaitDelay` 指定了 `Cmd` 在其關聯的 `Context` 被取消或其程序退出時的行為。

效能改進

  • 編譯器和垃圾回收器的改進減少了記憶體開銷,並將整體 CPU 效能提高了多達 2%。
  • 專門針對編譯時間的工作帶來了高達 10% 的構建改進。這使構建速度恢復到與 Go 1.17 相當的水平。

從原始碼構建 Go 發行版時,Go 1.20 需要 Go 1.17.13 或更新的版本。未來,我們計劃每年大約向前推進一次引導工具鏈。此外,從 Go 1.21 開始,一些較舊的作業系統將不再受支援:包括 Windows 7、8、Server 2008 和 Server 2012,macOS 10.13 High Sierra 和 10.14 Mojave。另一方面,Go 1.20 為 FreeBSD on RISC-V 增加了實驗性支援。

有關所有更改的完整且更詳細的列表,請參閱 完整發行說明

感謝所有透過編寫程式碼、提交 bug、分享反饋和測試候選版本為本次釋出做出貢獻的人。您的努力有助於確保 Go 1.20 儘可能穩定。一如既往,如果您發現任何問題,請 提交 issue

享受 Go 1.20!

下一篇文章:Profile-Guided Optimization 預覽
上一篇文章:分享您關於 Go 開發的反饋
部落格索引