Go 部落格

Go 1.20 發布!

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

今天,Go 團隊很榮幸發布 Go 1.20,您可以透過拜訪下載頁面來取得。

Go 1.20 受益於延長的開發階段,這是因為較早的廣泛測試和整體程式碼基礎的穩定性獲得改善所致。

我們特別興奮地推出效能導向最佳化 (PGO) 的預覽版,這使得編譯器能夠根據執行時期剖析資訊來執行特定於應用程式和工作負載的最佳化。向 go build 提供剖析資訊可使編譯器將一般應用程式的速度提升約 3-4%,我們預期未來的版本將進一步從 PGO 受益。由於這是 PGO 支援的預覽版,我們鼓勵大家嘗試看看,但仍有一些粗糙的邊緣可能妨礙生產用途。

Go 1.20 還包含一些語言變更、許多工具和函式庫改善功能,以及更好的整體效能。

語言變更

  • 預先宣告的 comparable 約束條件現在也會由 正規 可比較的類型(例如介面)滿足,這將簡化一般程式碼。
  • 已將函式 SliceDataStringStringData 新增至套件 unsafe。這些函式補齊了一組用於執行緒獨立切片與字串操作的函式。
  • 已擴充 Go 的類型轉換規則,可允許直接 將切片轉換成陣列
  • 語言規範現在已經定義了比較陣列元素和結構欄位的正確順序 (比較運算子)。這釐清了在比較時發生恐慌時的狀況。

工具改進

  • 現在 cover 工具 能收集完整程式的涵蓋率概況,而不再只是單元測試。
  • go 工具不再仰賴 $GOROOT/pkg 目錄中的預先編譯的標準程式庫套件封存檔,而這些封存檔也不再隨發行版附帶,因而下載時檔案會比較小。取而代之的是,標準程式庫中的套件會像其他套件一樣,視需要建置並快取在建置快取中。
  • 已改善 go test -json 的執行,讓他能在零散寫入 stdout 的情況下,更加健全。
  • go buildgo install 和其他與建置相關的指令,現在接受 -pgo 旗標,這個旗標能啟用輪廓引導最佳化以及使用 -cover 旗標進行完整程式涵蓋率分析。
  • 在沒有 C 工具鏈的系統上,go 指令現在預設停用 cgo。因此,當 Go 安裝在沒有 C 編譯器系統上時,它現在會使用純 Go 建置,針對標準程式庫中選擇性使用 cgo 的套件,而不是使用預先散佈的套件封存檔(如上所述,這些封存檔已經移除)。
  • 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 欄位 CancelWaitDelay 指定當相關聯的 Context 取消或其程序結束時,Cmd 的行為。

改善效能

  • 編譯和垃圾回收器改良已減少記憶體消耗並最高提升 2% 全體 CPU 效能。
  • 專門針對編譯時間的工作帶動編譯改良達 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 為 RISC-V 上的 FreeBSD 加入實驗性支援。

如需所有變更的完整且詳盡清單,請參閱 完整版本注意事項

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

享受 Go 1.20!

下一篇:輪廓導向最佳化預覽
上一篇:分享你對使用 Go 開發的回饋
部落格索引