回歸現(xiàn)實(shí):Go Leader 對(duì) 1.18 泛型的期望
大家好,我是煎魚。
前段時(shí)間根據(jù) Go 泛型的最新動(dòng)態(tài),我寫了一篇《出泛型后 API 怎么辦?Go 開發(fā)者要注意了》文章,引發(fā)了不少小伙伴的熱議。
Go 核心開發(fā)團(tuán)隊(duì)的現(xiàn)任 Leader @Russ Cox 在 golang-dev 中正式發(fā)表《expectations for generics in Go 1.18》對(duì) Go 泛型給出了 “期待”,其實(shí)大家可以認(rèn)為是后續(xù)泛型的配套迭代計(jì)劃了。
如果不出現(xiàn)嚴(yán)重的問題,Go 1.18 將會(huì)包括對(duì)泛型的支持,并且這次泛型的支持將會(huì)是有史以來最大的一次語言變化。
對(duì)以下幾點(diǎn)有顧慮:
- 最佳實(shí)踐.
- 生產(chǎn)經(jīng)驗(yàn)
- 兼容性承諾。
接下來,煎魚帶大家一起了解 Russ Cox 發(fā)表的 Go 泛型進(jìn)程,知悉官方一手消息。
最佳實(shí)踐
Go 團(tuán)隊(duì)表示不知道使用泛型的最佳實(shí)踐是什么,所以給出的官方文檔將無法就何時(shí)使用泛型和何時(shí)不使用泛型給出精確、明確的答案,只可以給出粗略的指導(dǎo)。
此處可以參考《Effective Go》的最初版本,是在不間斷地寫了一整年的 Go 代碼后,才正式輸出的。
按照現(xiàn)有的計(jì)劃,官方只會(huì)提供關(guān)于如何使用泛型的文檔,暫時(shí)無法提供任何關(guān)于風(fēng)格、最佳實(shí)踐的規(guī)定性文檔。
在提供的標(biāo)準(zhǔn)庫上,先是已經(jīng)通過提案的 maps 和 slices庫會(huì)先放到 golang.org/x/exp 中作為實(shí)驗(yàn),不會(huì)保證向后兼容。待成熟后,再推廣到標(biāo)準(zhǔn)庫中。
可以明確,Go 泛型出來后,社區(qū)就會(huì)陸續(xù)開始百花齊放,接著有官方輸出推薦方法了,歷史是如此的相似。
生產(chǎn)經(jīng)驗(yàn)
目前 Go 團(tuán)隊(duì)沒有關(guān)于泛型的生產(chǎn)經(jīng)驗(yàn),因此會(huì)在文檔中給出明確提示,讓大家在生產(chǎn)中使用泛型的時(shí)候應(yīng)該適當(dāng)謹(jǐn)慎。
泛型出來后,會(huì)陸續(xù)涉及到大量的重寫工作,但是由于現(xiàn)在處于中間階段。正在重寫的 Go 1.18 工具鏈去同時(shí)適配泛型、非泛型代碼是需要時(shí)間和經(jīng)驗(yàn)的,有一定的風(fēng)險(xiǎn)。
因此泛型出來后,可能會(huì)出現(xiàn)一些意想不到的問題,僅在生產(chǎn)發(fā)現(xiàn)(教訓(xùn))。
兼容性承諾
Go1.18 會(huì)和其他 Go1.x 版本一樣,保證向后兼容的承諾:不會(huì)破壞用 Go 1.18 構(gòu)建的代碼,包括使用泛型的代碼。
如果是最壞的情況,如果發(fā)現(xiàn) Go 1.18 的語義有一些致命的問題,并需要改變它們(例如:在Go 1.19 中)。
將會(huì)使用 go.mod 文件的 go 行來確定該模塊中的源文件是期待 Go 1.18 還是 Go 1.19+ 語義,以此實(shí)現(xiàn)版本控制。但目前來看,不需要這樣做。
也建議急于使用 Go 泛型的開源庫作者,做好泛型和非泛型版本代表的支持和隔離,這樣對(duì)用戶會(huì)更加的友好。
總結(jié)
可以明確的是,Go 泛型的整體推進(jìn)方案,在這篇文章中均已說明。Go 官方團(tuán)隊(duì)也與許多第三方工具的作者進(jìn)行溝通。
第三方工具可能不會(huì)在 Go 1.18 發(fā)布時(shí)就完全支持泛型,這會(huì)由各作者自行根據(jù)自己的時(shí)間表來更新。
煎魚猜測推進(jìn)節(jié)奏就是:
- 支持泛型語法。
- 觀察。
- 推進(jìn)標(biāo)準(zhǔn)/工具庫。
- 逐步替換。
- 修 BUG。
- 觀察、優(yōu)化
- 生產(chǎn)可用。
大概需要 2~3 個(gè) Go 版本,需要 1~2 年,Go 泛型的各類配套組件就會(huì)基本完善,可用,轉(zhuǎn)為持續(xù)優(yōu)化了。