出泛型后 API 怎么辦?Go 開發(fā)者要注意了
大家好,我是煎魚。
前段時間社區(qū)里一下子就爆了,主要是各大媒體引用了 Go 語言之父 Rob Pike 所提的《go: don't change the libraries in 1.18》。
很多社交媒體都做了跟進(jìn),認(rèn)為 Rob Pike 是硬性的反對 Go 泛型的 API 改造!
如果讀者只看了標(biāo)題,有可能會產(chǎn)生一些誤解實際上其表達(dá)的意思和近期 Go 社區(qū)討論的事項是有關(guān)聯(lián)的,要一起綜合來看。
為此,今天煎魚就和大家一起來理一理,看看 Go 泛型 API 的改造工程,是個怎么一回事?
現(xiàn)狀
馬上就是 2021.11 月,連深圳都變冷了...根據(jù) Go 語言的發(fā)布周期,Go1.18 版本的發(fā)布,那就是 2022.02 月左右。
現(xiàn)在給到 Ian Lance Taylor、 Robert Griesemer 等大佬僅剩 3 個月的時間給大家討論泛型細(xì)節(jié),進(jìn)一步完善實現(xiàn),達(dá)到生產(chǎn)可用。
拋出 Go 泛型的實現(xiàn)進(jìn)度不說,現(xiàn)在遇到了一個比較大的問題。那就是實現(xiàn)泛型后 ”如何更新泛型的 API“。
這之中包含好幾個方面,分別是:既有標(biāo)準(zhǔn)庫、開源庫,新標(biāo)準(zhǔn)庫等。不同庫之間是不同的人在維護(hù)。
但這里存在一個大問題,如下圖:
Russ Cox 在 9 月就提出了 ”how to update APIs for generics“ 的疑惑,當(dāng)時顯然這一塊還沒有共識。在 11 月的現(xiàn)在,從討論的記錄來看,怎么做還沒有達(dá)成一個最終的明確共識(初步已有,未正式答復(fù))。
但存在一個問題,Go 社區(qū)對于泛型的迫切度,熱情非常高,各種泛型化的標(biāo)準(zhǔn)庫的提案都提出來了,推著設(shè)計者往前走。
爭議
結(jié)合來看 Rob Pike,更多是:建議和提醒 Go 社區(qū)和核心開發(fā)團(tuán)隊,要 ”悠著點“,Go1.18 想支持泛型,做完成庫的改造,還得代價小,畢竟細(xì)節(jié)很多。
引用其理由,核心論據(jù)是:
在一個版本中,做泛型、標(biāo)準(zhǔn)庫等,要做的事情太多,很可能會弄錯。
- 沒有在 Go 中使用新類型的經(jīng)驗,無法為其設(shè)計提供有力的依據(jù)。
- Go1 兼容性的承諾,在任何細(xì)節(jié)上出錯的代價都很高,要等待、觀察和學(xué)習(xí)。
- 和一句諺語很接近:”不要一口氣吃胖子“,何況沒有相關(guān)的經(jīng)驗,都只是詳細(xì)的推理、預(yù)演,需要晉升。
在 Go issues 中也有人吐槽,1.18 空有泛型的實現(xiàn)。其他配套的標(biāo)準(zhǔn)庫等都沒有,那這個 Go1.18 出來的泛型意義是?
后續(xù)
雖然還沒有最終拍板,但是根據(jù)討論的過程和社區(qū)贊同數(shù)(??)來看,如下:
后續(xù)仍然會設(shè)計、構(gòu)建、測試和使用用于切片(Slice)、地圖(Map)、通道(Channel)等的新庫。
這些庫并沒有生產(chǎn)可用,會把他們放在 golang/x/exp 倉庫中,可以使用,僅作為現(xiàn)階段的實驗性的庫,沒有兼容性保障。
該實驗庫會在一兩個周期內(nèi)會改變、調(diào)整和發(fā)展。能夠讓 Go 社區(qū)的開發(fā)者們嘗試一下使用,以便接受更多的意見。
再根據(jù)使用者的反饋通過經(jīng)驗和分析進(jìn)行更新,就會把它們移到主倉庫中,才達(dá)到正式生產(chǎn)可用的級別。
總結(jié)
在今天這篇文章中,我們針對 Rob Pike 為什么會要調(diào)整 Go 泛型后的標(biāo)準(zhǔn)庫 API 等的提議進(jìn)行了分析。
為此我們了解到 Go 核心團(tuán)隊對 ”how to update APIs for generics“ 的顧慮,以及現(xiàn)有社區(qū)的激情,綜合來看,給出的逐步演進(jìn)的泛型方案建議。
以此可知,Go 完整泛型(含配套庫)的生產(chǎn)可用,可能還要經(jīng)歷幾個 Go 版本,讓不少人望穿秋水了...