Go 部落格
Go語言十四年

今天我們慶祝Go開源版釋出十四週年!Go在過去一年中取得了輝煌的成就,釋出了兩個功能豐富的版本,並實現了其他重要里程碑。
我們分別於2023年2月釋出了Go 1.20,並於2023年8月釋出了Go 1.21,更加關注實現上的改進而非語言本身的新增特性。
Profile-guided optimization (PGO)(在Go 1.20中預覽,在Go 1.21中釋出)允許Go編譯器讀取程式的分析報告,然後將更多時間用於最佳化程式中最常執行的部分。在Go 1.21中,啟用PGO後,通常可以使CPU使用率提升2%到7%。有關概述,請參閱“Go 1.21 中的Profile-guided optimization”,有關完整文件,請參閱Profile-guided optimization 使用者指南。
自Go 1.2以來,Go一直支援在go test
期間收集覆蓋率報告。Go 1.20增加了對go build
構建的二進位制檔案收集覆蓋率報告的支援,這使得您也可以在更大型的整合測試期間收集覆蓋率。有關詳細資訊,請參閱“Go整合測試的程式碼覆蓋率”。
自“Go 1 和 Go 程式的未來”以來,相容性一直是Go的重要組成部分。Go 1.21透過擴大GODEBUG的使用約定,進一步改進了相容性。在我們需要進行更改(例如重要的bug修復)但可能仍會破壞現有程式的情況下,可以使用GODEBUG。有關概述,請參閱部落格文章“向後相容性、Go 1.21 和 Go 2”,有關詳細資訊,請參閱文件“Go、向後相容性與GODEBUG”。
Go 1.21 還提供了對內建工具鏈管理的更好支援,讓您可以像更改其他依賴項的版本一樣,輕鬆地更改特定模組中使用的Go工具鏈版本。有關概述,請參閱部落格文章“Go 1.21 中的向前相容性和工具鏈管理”,有關詳細資訊,請參閱文件“Go 工具鏈”。
另一個重要的工具鏈改進是將磁碟索引整合到gopls(Go LSP伺服器)中。這在典型用例中將gopls的啟動延遲和記憶體使用量降低了3-5倍。“為不斷增長的Go生態系統擴充套件gopls”解釋了技術細節。您可以透過執行以下命令來確保您使用的是最新的gopls:
go install golang.org/x/tools/gopls@latest
Go 1.21 引入了新的 cmp、maps 和 slices 包——這是Go的第一個泛型標準庫——並擴充套件了可比較型別的集合。有關詳細資訊,請參閱部落格文章“你所有的可比較型別”。
總的來說,我們繼續完善泛型,並撰寫演講和部落格文章來解釋重要的細節。今年有兩個值得注意的帖子:“解構型別引數”和“關於型別推斷,你一直想知道的一切——以及更多”。
Go 1.21 中另一個重要的包是 log/slog,它為標準庫添加了一個結構化日誌的官方API。有關概述,請參閱“使用slog進行結構化日誌記錄”。
對於WebAssembly (Wasm) 埠,Go 1.21 增加了對在WebAssembly System Interface (WASI) preview 1上執行的支援。WASI preview 1是一個新的 Wasm“作業系統”介面,大多數伺服器端 Wasm 環境都支援它。有關演練,請參閱“Go 中的 WASI 支援”。
在安全方面,我們繼續確保Go在幫助開發者瞭解其依賴項和漏洞方面處於領先地位,並於7月推出了Govulncheck 1.0。如果您使用VS Code,您可以透過Go擴充套件直接在編輯器中執行govulncheck:請參閱本教程開始。如果您使用GitHub,您可以在CI/CD中使用govulncheck,使用GitHub Action for govulncheck。有關檢查依賴項中的漏洞問題的更多資訊,請參閱今年的Google I/O演講“使用Go和Google構建更安全的應用”。)
另一個重要的安全里程碑是Go 1.21高度可復現的工具鏈構建。有關詳細資訊,請參閱“完全可復現、經過驗證的Go工具鏈”,包括在不使用任何Linux工具的情況下,在Mac上覆現Ubuntu Linux Go工具鏈的演示。
這一年忙碌充實!
在Go的第15年,我們將繼續努力,使Go成為大規模軟體工程的最佳環境。我們特別激動的一項改變是重新定義 for 迴圈的 :=
語義,以消除意外的別名(aliasing)bug。有關詳細資訊,包括在Go 1.21 中預覽此更改的說明,請參閱“修復Go 1.22 中的For迴圈”。
感謝!
Go專案遠不止Google的Go團隊。感謝所有貢獻者以及Go社群的每個人,是你們共同成就了今天的Go。祝願大家在新的一年裡一切順利。
下一篇文章: Go開發者調查2023 H2結果
上一篇文章: 關於型別推斷,你一直想知道的一切——以及更多
部落格索引