Go 部落格
Go 的十一年
今天我們慶祝 Go 開源釋出十一週年。我們為Go 十歲生日舉辦的派對似乎還近在眼前。今年是充滿挑戰的一年,但我們一直在推動 Go 的開發向前發展,並取得了不少重要的進展。
在十一月,我們 Go 的十歲生日過後不久,就推出了go.dev 和 pkg.go.dev。
二月,Go 1.14 釋出帶來了第一個正式的“生產可用”的 Go Modules 實現,以及許多效能改進,包括更快的 defer 和非協作式 goroutine 搶佔,以降低排程和垃圾回收的延遲。
三月初,我們推出了Protobuf 的新 API,即google.golang.org/protobuf,它極大地改進了 Protobuf 反射和自定義訊息的支援。

當疫情爆發時,我們決定暫停春季的任何公開公告或釋出,認識到大家的注意力理應放在其他地方。但我們一直在工作,我們的團隊成員加入了 Apple/Google 關於隱私保護的暴露通知的合作,以支援全球的接觸者追蹤工作。五月,該團隊推出了用 Go 編寫的參考後端伺服器。
我們繼續改進gopls,它為許多編輯器提供了先進的Go 感知支援。六月,VSCode Go 擴充套件正式加入 Go 專案,現在由與 gopls 相同的開發人員維護。
同樣在六月,感謝您的反饋,我們將pkg.go.dev 的後端程式碼作為 Go 專案的一部分開源了。
六月晚些時候,我們釋出了泛型的最新設計草案,以及一個原型工具和泛型遊樂場。
七月,我們釋出並討論了三個關於未來更改的新設計草案:用於檔案選擇的新的 //go:build
行、檔案系統介面和構建時檔案嵌入。(正如下面所指出的,我們將在 2021 年看到所有這些。)
八月,Go 1.15 釋出主要提供了最佳化和錯誤修復,而不是新功能。其中最顯著的是連結器重寫的開始,使其執行速度提高了 20%,在大型構建中平均記憶體使用量減少了 30%。
上個月,我們進行了年度Go 使用者調查。在分析結果後,我們將在部落格上釋出。
Go 社群像其他人一樣適應了“虛擬優先”模式,今年我們看到了許多虛擬的聚會和十幾個虛擬的 Go 會議。上週,Go 團隊在Google 開源直播的 Go 日(連結處有影片)上主持了活動。
展望未來
我們也對 Go 第十二年的發展充滿期待。最直接的是,本週 Go 團隊成員將在GopherCon 2020 上進行八場演講。請記下您的日曆!
- Robert Griesemer 的演講“Typing [Generic] Go”,
11 月 11 日,美國東部時間上午 10:00;上午 10:30 進行問答。 - “What to Expect When You’re NOT Expecting”,Go Time 播客的現場錄製,特邀專家除錯員包括 Hana Kim,
11 月 11 日中午 12:00. - Michael Knyszek 的演講“Evolving the Go Memory Manager’s RAM and CPU Efficiency”,
11 月 11 日下午 1:00;下午 1:50 進行問答。 - Dan Scales 的演講“Implementing Faster Defers”,
11 月 11 日下午 5:10;下午 5:40 進行問答。 - “Go Team - Ask Me Anything”,與 Julie Qiu、Rebecca Stambler、Russ Cox、Sameer Ajmani 和 Van Riper 的現場問答,
11 月 12 日下午 3:00. - Austin Clements 的演講“Pardon the Interruption: Loop Preemption in Go 1.14”,
11 月 12 日下午 4:45;下午 5:15 進行問答。 - Jonathan Amsterdam 的演講“Working with Errors”,
11 月 13 日下午 1:00;下午 1:50 進行問答。 - Carmen Andoh 的演講“Crossing the Chasm for Go: Two Million Users and Growing”,
11 月 13 日下午 5:55.
Go 版本釋出
二月,Go 1.16 版本將包含新的檔案系統介面和構建時檔案嵌入。它將完成連結器的重寫,帶來額外的效能改進。並將支援新的 Apple Silicon (GOARCH=arm64
) Mac。
八月,Go 1.17 版本無疑會帶來更多功能和改進,儘管距離現在還有一段距離,具體細節仍未確定。它將包含一個針對 x86-64 的新的基於暫存器的呼叫約定(不會破壞現有彙編!),這將使程式的整體速度更快。(其他架構將在後續版本中跟進。)一個肯定會被包含的不錯的功能是新的//go:build
行,它比當前的 //
+build
行更不容易出錯。另一個備受期待的功能是希望明年能準備好進行 beta 測試的 go test
命令中的模糊測試支援。
Go Modules
在接下來的一年裡,我們將繼續致力於開發 Go Modules 的支援,並將其很好地整合到整個 Go 生態系統中。Go 1.16 將提供我們迄今為止最流暢的 Go Modules 體驗。我們最近調查的一個初步結果是,96% 的使用者已經採用了 Go Modules(相比之下,一年前是 90%)。
我們將最終停止對基於 GOPATH 的開發的支援:任何使用標準庫以外的依賴項的程式都需要一個 go.mod
檔案。(如果您還沒有切換到 Modules,請參閱GOPATH wiki 頁面以瞭解從 GOPATH 到 Modules 的旅程中的最後一步的詳細資訊。)
從一開始,Go Modules 的目標就是“將包版本化的概念新增到 Go 開發者和我們的工具的通用詞彙中”,以在整個 Go 生態系統中實現對 Modules 和版本的深度支援。由於對包版本是什麼有了整個生態系統的理解,Go Modules 映象、校驗資料庫和索引才得以實現。在接下來的一年裡,我們將看到更多工具和系統新增豐富的 Modules 支援。例如,我們計劃研究新的工具來幫助 Modules 作者釋出新版本(go release
),以及幫助 Modules 消費者更新他們的程式碼以遷移掉已棄用的 API(一個新的 go fix
)。
作為一個更大的例子,我們建立了 gopls 來減少編輯器使用的許多 Go 支援工具,而這些工具都不支援 Modules,最終統一為一個支援 Modules 的工具。在接下來的一年裡,我們將準備好讓 VSCode Go 擴充套件預設使用 gopls
,從而開箱即用地獲得出色的 Modules 體驗,並將釋出 gopls 1.0。當然,gopls 最好的地方之一是它不依賴於編輯器:任何理解語言伺服器協議的編輯器都可以使用它。
版本資訊的另一個重要用途是跟蹤構建中的任何包是否存在已知漏洞。在接下來的一年裡,我們計劃開發一個已知漏洞資料庫以及用於根據該資料庫檢查程式的工具。
Go 包發現網站pkg.go.dev是 Go Modules 促成的另一個版本感知系統的例子。我們一直專注於正確地實現核心功能和使用者體驗,包括今天推出的重新設計的版本。在接下來的一年裡,我們將把 godoc.org 合併到 pkg.go.dev 中。我們還將擴充套件每個包的版本時間線,顯示每個版本中的重要更改、已知漏洞等,遵循總體目標,即提供您做出關於新增依賴項的明智決策所需的資訊。
我們很高興看到從 GOPATH 到 Go Modules 的這一歷程即將完成,以及 Go Modules 所支援的所有優秀的依賴感知工具。
泛型
每個人都在關注的下一個功能無疑是泛型。正如我們上面提到的,我們在六月釋出了泛型的最新設計草案。自那時以來,我們一直在不斷完善細節,並將注意力轉向實現生產就緒版本的細節。我們將在整個 2021 年致力於此,目標是在年底前提供一些可以供大家試用的東西,也許是 Go 1.18 beta 版本的一部分。
感謝!
Go 的意義遠不止我們 Google 的 Go 團隊。我們非常感謝與我們一起進行 Go 版本釋出和工具開發的貢獻者。除此之外,Go 的成功離不開所有在 Go 蓬勃發展的生態系統中工作並做出貢獻的你們。今年的世界充滿了挑戰。我們比以往任何時候都更感激您抽出寶貴時間與我們一起,幫助 Go 取得如此巨大的成功。謝謝您。希望您一切安好,並祝您一切順利。
下一篇文章:將 godoc.org 請求重定向到 pkg.go.dev
上一篇文章:Pkg.go.dev 全新改版!
部落格索引