新聞中心
本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚(yú)了」,作者陳煎魚(yú)。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚(yú)了公眾號(hào)。

大家好,我是慢一拍的后方記者煎魚(yú)。
按照先前官方和文章的說(shuō)法,Go 泛型預(yù)計(jì)是在 Go1.18 正式釋出。
在 GopherCon 2020 Go Team AMA 時(shí),要在今年底要能有生產(chǎn)環(huán)境的試用版上線,這是 rsc 所提出的一個(gè)管理目標(biāo)。
轉(zhuǎn)折點(diǎn)
近期出現(xiàn)了一個(gè)新的轉(zhuǎn)折點(diǎn),能夠讓大家在主干分支(master)上就能享受到泛型的功能。
而 master 分支對(duì)應(yīng)了 Go1.17 的版本。因此未來(lái)將可以在 Go1.17 使用到泛型,這是一個(gè)比較驚喜的事情。
原因
這件事情為什么會(huì)突然發(fā)生呢?一切都得從背景說(shuō)起。原本 Go 泛型是一直在 dev.typeparams 分支上進(jìn)行研討和開(kāi)發(fā)。
由于泛型不是簡(jiǎn)單的一兩個(gè)模塊的代碼變更,而是涉及大量的代碼變更。
因此需要經(jīng)常保持與 master 分支的代碼同步(近兩個(gè)月共 20+ 次),會(huì)涉及代碼沖突/合并的處理。
且對(duì)于一些沖突的模塊他們也不熟悉(很熟悉的感覺(jué)有沒(méi)有),所以期望遷移到 master 分支上進(jìn)行開(kāi)發(fā)。
如何不影響既有功能
這類(lèi)提前放入主版本的操作,在 Go 語(yǔ)言中并不少見(jiàn)。像是現(xiàn)在所見(jiàn)的 GO111MODULE,早期的GO15VENDOREXPERIMENT 都有些這么個(gè)味道。都是逐步入場(chǎng),分階段使用,等確定成熟、完善后再漸漸去掉。
因此本次泛型也采取了這種方法,按照提案,目前使用的是 -G 標(biāo)識(shí)做為泛型的開(kāi)關(guān)。
計(jì)劃如下:
- -G=0:繼續(xù)使用傳統(tǒng)的類(lèi)型檢查器。
- -G=1:使用 type2,但不支持泛型。
- -G=2:使用 type2,支持泛型。
在完成 types2 的錯(cuò)誤和現(xiàn)有的錯(cuò)誤的開(kāi)發(fā)協(xié)調(diào)后,計(jì)劃在 Go 1.17 將 -G=1 設(shè)置為默認(rèn)值。
未來(lái)也許可以在 Go 1.18 中放棄對(duì) -G=0 的支持,這樣后續(xù)在默認(rèn)啟用 -G=2 上會(huì)變得更容易。
在 Go1.17 嘗鮮
在 Go1.17 嘗鮮,也就意味著需要拉取 Go 語(yǔ)言的 master 分支的代碼,Go1.17 現(xiàn)在正處于開(kāi)發(fā)階段:
我們可以通過(guò) gotip 來(lái)達(dá)到下載 master 分支代碼的目的:
- $ go get golang.org/dl/gotip
- $ gotip download
- From https://go.googlesource.com/go
- * branch master -> FETCH_HEAD
- 44361140c0..d9fd38e68b master -> origin/master
- Previous HEAD position was 44361140c0 embed: update docs for proposal tweaks
- ...
在拉取完畢后可以執(zhí)行 gotip version 查看所拉取的版本(commit-id):
- $ gotip version
- go version devel +d9fd38e68b Sat Feb 27 03:03:29 2021 +0000 darwin/amd64
在確定 gotip 正常后,我們就可以編寫(xiě)泛型的示例代碼了,如下:
- func Print[T any](s []T) {
- for _, v := range s {
- fmt.Print(v)
- }
- }
- func main() {
- Print([]string{"腦子進(jìn), ", "煎魚(yú)了\n"})
- }
如果執(zhí)行像往常那樣執(zhí)行,是會(huì)直接提示無(wú)法識(shí)別泛型的一些標(biāo)識(shí)符:
- $ gotip run main.go
- # command-line-arguments
- ./main.go:7:6: missing function body
- ./main.go:7:11: syntax error: unexpected [, expecting (
結(jié)合上文的解析,我們需要指定 -G 標(biāo)識(shí),就可以運(yùn)行了。如下:
- $ gotip run -gcflags=all=-G=3 main.go
- # command-line-arguments
- ./main.go:7:6: internal compiler error: Cannot export a generic function (yet): Print
顯然,正確的走進(jìn)泛型的邏輯里去了,雖然愉快的報(bào)錯(cuò)了,但 Matthew Dempsky 表示這很正常,畢竟 Go 泛型還在開(kāi)發(fā)階段。
可能會(huì)有的小伙伴注意到,-G 指定的是 3,與前文所述不符。這與早期的編碼有關(guān):
已經(jīng)提了 CL 變更,只是代碼沖突了,待解決。
總結(jié)
Go 語(yǔ)言的泛型開(kāi)發(fā)計(jì)劃已經(jīng)比較明確。首先合入 master 分支,再逐步完成開(kāi)發(fā),逐步開(kāi)放。
再進(jìn)行 -G 默認(rèn)值的調(diào)整,最后在泛型完善后就默認(rèn)開(kāi)啟,把 -G 標(biāo)識(shí)徹底去掉。
細(xì)品,與 Go modules 的方向是不是差不多。一開(kāi)始 GO111MODULE 需要手動(dòng)開(kāi)啟 on(也就是默認(rèn) off),再到 Go1.16 GO111MODULE 默認(rèn)為 on。
以此完成了一個(gè)正反饋的循環(huán),逐步開(kāi)放,接受社區(qū)反饋和開(kāi)發(fā)調(diào)整。
結(jié)論,Go 泛型指日可待了。
新聞標(biāo)題:令人激動(dòng)!Go泛型代碼合入Master(附嘗鮮方法)
標(biāo)題鏈接:http://fisionsoft.com.cn/article/dhipoho.html


咨詢
建站咨詢
