你期望 Go 1.18 中泛型是什么樣子?
大家好,我是程序員幽鬼。
前段時間 Rob Pike 在 Go repo 提了一個 issue:go: don't change the libraries in 1.18[1],提到因為泛型是語言層面的大改動,必須循序漸進,步子不能邁太大。具體介紹可以查看:Go 重視兼容性是認真的:泛型得慢慢加。
昨天,Go Team Leader Russ Cox 在 golang-dev 郵件組發了一篇較長的郵件:expectations for generics in Go 1.18[2],對 Go 1.18 與泛型當前進展及后續的支持策略做了說明,已確定 Go 核心團隊與社區的努力方向。
以下是該郵件的內容,非完全翻譯版。
如果不出嚴重意外的話,Go 1.18 將包含對泛型的支持。泛型是自 Go1 發布以來最重要的變化,當然也是我們做過的最大一次語言變化[3]。這封郵件解釋了包含泛型對我們和用戶的意。
任何新的 Go 特性,無論是語言層面還是庫層面,都帶有不確定性:包括不確定如何使用它,不確定如何不使用它,以及關于哪些微小 bug 已經通過現有測試的不確定性。泛型的加入當然也會存在這種不確定性。事實上,由于泛型是一個較大的新特性,因此不確定性也相應地更大。
因為我們不知道使用泛型的最佳實踐是什么,我們的文檔將無法給出關于何時使用它們以及何時不使用它們的準確、明確的答案。當然,我們可以而且仍然會給出粗略的泛型使用指南。其實,我們之前也有類似的做法:我們在不間斷地編寫 Go 代碼一整年之后,才寫出了 Effective Go 的初始版本[4]。我們對泛型同樣沒有高水平的經驗,因此,雖然我們會提供有關如何使用泛型的文檔,但我們無法提供任何關于代碼風格和最佳實踐的說明。
因為我們不知道編寫泛型包的最佳實踐是什么,因此,原本計劃發布的特意為泛型增加的包 maps 和 slices,不會進入標準庫,而是先放入 golang.org/x/exp[5],這里的代碼不保證向后兼容。一旦我們有了更多的經驗,我們希望將其中一些包加入到標準庫中。不過,constraints 包會如期進入 Go1.18 的標準庫中,因為它是編寫某些泛型代碼的基礎。
因為我們沒有 Go 泛型的任何線上使用經驗,所以我們將在發行說明中明確指出,應適當謹慎地處理泛型的生產用途(注:大概率大家也會比較謹慎,不會立馬使用)。注意,這不是說團隊的工作不出色。畢竟,泛型與大多數 Go 更改不同。當時,我們重寫垃圾收集器或更改調用規約時,我們會使用新的實現在測試和生產中運行所有 Google 的 Go 程序,這樣就能很好地驗證了變化,發現難以發現的錯誤。相比之下,還在開發的 Go 1.18 工具鏈重建非泛型代碼并不能驗證對泛型的支持,這意味著我們無法建立同樣的信心。
綜上所述,Go 1.18 具有與其他 Go 1.x 版本相同的向后兼容性承諾:我們不會破壞使用 Go 1.18 構建的代碼,包括使用泛型的代碼。在最壞的情況下,如果我們發現 Go 1.18 語義存在一些致命問題并需要更改它們(例如在 Go 1.19 中),我們將使用 go.mod 文件的 go 版本指示來確定該 module 中的源文件是期望 Go 1.18 還是 Go 1.19+ 語義。(目前,我們預計不需要這樣做!)
我們預計一些第三方包的作者會第一時間采用泛型。如果你正在更新你的包以使用泛型,請考慮將新的泛型 API 單獨到它自己的文件中,并增加 Go1.18 的構建 tag,如 //go:build go1.18,以便 Go 1.17 用戶可以繼續構建和使用非泛型。
另外值得注意的是,第三方工具在 Go 1.18 版本發布時可能不完全支持泛型。我們正在與許多工具的作者交流,并試圖確保他們得到適當的更新,但每個工具都會有自己的時間表。
有不少人給我們反饋了一個常見問題:考慮到所有這些不確定性,為什么不讓泛型在 Go1.18 中成為可選的?(注:實際上,Go1.17 就有部分可選了)實際上,在這一點上,減少不確定性的唯一方法是默認情況下提供泛型。當我們在 Go 1.5 中可選地加入 vendoring 時,結果真實情況是幾乎沒有人真正使用它,直到 Go 1.6 默認打開它,大家才使用它。所以 Go 1.5 版本沒有減少我們對 Go 開發者使用 vendoring 情況的不確定性。另一方面,這種情況,Go 1.5 版本無疑將生態系統分為“在標準 Go 下運行的代碼”和“在啟用 vendoring 后運行的代碼”兩個部分。我們希望 Go1.18 盡可能地避免這種結果。
作為 Go 愛好者,作為期待泛型的你,最重要的事情是編寫一些泛型代碼,如果你發現了 bug、不清楚的編譯器錯誤等,請提 issue。我最近寫了一些泛型數據結構,對整體體驗非常滿意。我希望你也是;如果沒有這種感覺,請提交 issue。謝謝!
本文轉載自微信公眾號「幽鬼」,可以通過以下二維碼關注。轉載本文請聯系幽鬼公眾號。