Go 部落格

Go 語言的十一年

Russ Cox,代表 Go 團隊
2020 年 11 月 10 日

今天,我們慶祝 Go 開源版本釋出十一週年。為 Go 問世十週年舉辦的派對似乎已是遙遠的記憶。這是艱難的一年,但我們一直在推動 Go 開發向前發展,並積累了不少亮點。

在 11 月,Go 問世十週年後不久,我們啟動了 go.dev 和 pkg.go.dev

在 2 月,Go 1.14 版本釋出了第一個正式“生產就緒”的 Go modules 實現,以及許多效能改進,包括 更快的 defer非協作式 goroutine 搶佔,以減少排程和垃圾回收延遲。

在 3 月初,我們釋出了 protocol buffers 的新 APIgoogle.golang.org/protobuf,極大地改進了對 protocol buffer 反射和自定義訊息的支援。

當疫情爆發時,我們決定暫停春季的所有公開公告或釋出,認識到大家的注意力理應放在其他地方。但我們沒有停下工作,我們團隊的一名成員加入了 Apple/Google 關於隱私保護接觸通知的合作,以支援全球的接觸者追蹤工作。5 月,該團隊釋出了用 Go 編寫的參考後端伺服器

我們持續改進 gopls,它使許多編輯器能夠實現高階的Go 感知支援。6 月,VSCode Go 擴充套件正式加入 Go 專案,現由開發 gopls 的同一批開發者維護。

同樣在 6 月,感謝您的反饋,我們將 pkg.go.dev 背後的程式碼作為 Go 專案的一部分開源了。

6 月晚些時候,我們釋出了泛型的最新設計草案,以及一個原型工具和泛型演練場

7 月,我們釋出並討論了未來修改的三個新設計草案:用於檔案選擇的新 //go:build檔案系統介面構建時檔案嵌入。(正如稍後所述,所有這些都將在 2021 年實現。)

在 8 月,Go 1.15 版本主要帶來了最佳化和錯誤修復,而非新功能。最重要的是開始重寫連結器,平均使大型構建速度提升 20%,記憶體使用減少 30%。

上個月,我們進行了年度 Go 使用者調查。分析完成後,我們將在部落格上釋出結果。

Go 社群和其他所有人一樣適應了“虛擬優先”的模式,今年我們看到了許多虛擬交流會和十多個虛擬 Go 會議。上週,Go 團隊在 Google Open Source Live 舉辦了 Go 日活動(連結中包含影片)。

展望未來

我們也對 Go 語言的第 12 年充滿了期待。最直接的是,本週 Go 團隊成員將在 GopherCon 2020 大會上呈現八場活動。請記下時間!

Go 版本釋出

在 2 月,Go 1.16 版本將包括新的檔案系統介面構建時檔案嵌入。它將完成連結器重寫,帶來額外的效能提升。並將支援新的 Apple Silicon (GOARCH=arm64) Mac。

在 8 月,Go 1.17 版本無疑將帶來更多功能和改進,儘管具體細節目前尚不明朗。它將包括一個新的基於暫存器的 x86-64 呼叫約定(不會破壞現有彙編程式碼!),這將使程式整體更快。(其他架構將在後續版本中跟進。)一項肯定會包含的不錯特性是新的 //go:build,它比當前的 // +build更不容易出錯。另一個備受期待、我們希望明年能進行 Beta 測試的功能是go test 命令中支援 Fuzzing

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 module mirror、checksum database 和 index 正是基於整個生態系統對包版本是什麼的理解而得以實現。在接下來的一年裡,我們將看到更多工具和系統增加豐富的 module 支援。例如,我們計劃研究新的工具,幫助 module 作者釋出新版本(go release),並幫助 module 使用者更新其程式碼,從廢棄的 API 遷移(新的 go fix)。

舉一個更大的例子,我們建立了 gopls,將編輯器用於 Go 支援的許多工具(這些工具都不支援 modules)精簡為一個支援 modules 的工具。在接下來的一年裡,我們將準備好讓 VSCode Go 擴充套件預設使用 gopls,提供出色的開箱即用的 module 體驗,並且我們將釋出 gopls 1.0。當然,gopls 的一大優點是它與編輯器無關:任何理解語言伺服器協議的編輯器都可以使用它。

版本資訊的另一個重要用途是跟蹤構建中的任何包是否存在已知漏洞。在接下來的一年裡,我們計劃開發一個已知漏洞資料庫,以及用於對照該資料庫檢查您的程式的工具。

Go 包發現網站 pkg.go.dev 是另一個由 Go modules 支援的版本感知系統的例子。我們一直專注於完善核心功能和使用者體驗,包括今天推出的重新設計。在接下來的一年裡,我們將把 godoc.org 整合到 pkg.go.dev 中。我們還將擴充套件每個包的版本時間線,顯示每個版本中的重要更改、已知漏洞等,其總體目標是展示您所需的資訊,以便就新增依賴項做出明智的決定

我們很高興看到從 GOPATH 到 Go modules 的過渡即將完成,以及 Go modules 所促成的所有出色的依賴感知工具。

泛型

大家最關心的下一個特性當然是泛型。正如我們上面提到的,我們在 6 月份釋出了泛型的最新設計草案。從那時起,我們一直在完善細節,並將注意力轉向實現生產就緒版本的具體工作。我們將在 2021 年全年致力於此,目標是在年底前推出供大家試用的版本,可能是 Go 1.18 Beta 版的一部分。

感謝您!

Go 遠不止是我們在 Google 的 Go 團隊。我們非常感謝與我們一起開發 Go 版本和工具的貢獻者。除此之外,Go 的成功離不開所有在 Go 生態系統中工作和貢獻的你們。對於 Go 之外的世界來說,這是艱難的一年。我們比以往任何時候都更感謝您抽出時間加入我們,幫助 Go 取得如此巨大的成功。謝謝您。我們希望大家都能平安健康,並祝願一切順利。

下一篇文章:將 godoc.org 請求重定向到 pkg.go.dev
上一篇文章:Pkg.go.dev 煥然一新!
部落格索引