本文转载自微信公众号《我的大脑是炸鱼》,作者陈建宇。转载本文请联系脑筋急转弯公众号。大家好,我是慢镜头的后方记者建宇。根据之前的官方和文章,Go泛型有望在Go1.18正式发布。在GopherCon2020GoTeamAMA上,今年年底应该会推出生产环境的试用版,这是rsc提出的管理目标。转折点最近出现了一个新的转折点,让大家在主分支(master)上享受泛型功能。master分支对应Go1.17版本。因此,泛型会在未来的Go1.17中可用,这是相当令人惊喜的。原因为什么这件事会突然发生?一切都得从背景说起。最初,Go泛型是在dev.typeparams分支上讨论和开发的。因为泛型不是一个或两个模块的简单代码更改,而是涉及大量的代码更改。因此需要经常保持master分支的代码同步(近两个月20+次),这会涉及到代码冲突/合并的处理。并且对一些冲突的模块不熟悉(是不是感觉很熟悉),所以期望迁移到master分支进行开发。把操作提前放到主版本中在Go语言中并不少见,比如如何不影响已有的功能。像现在看到的GO111MODULE,早期的GO15VENDOREXPERIMENT就有这样的味道。都是循序渐进,分阶段使用,确定成熟完善后逐步撤除。因此,泛型也采用这种方式。根据提案,-G标志目前用作泛型的开关。计划如下:-G=0:继续使用传统的类型检查器。-G=1:使用type2,但不支持泛型。-G=2:使用type2,支持泛型。-G=1计划在type2错误和现有错误的开发协调完成后成为Go1.17中的默认值。将来,Go1.18可能会放弃对-G=0的支持,这样将来默认启用-G=2会更容易。Go1.17尝鲜Go1.17尝鲜意味着你需要拉取Go语言master分支的代码。Go1.17现在处于开发阶段:我们可以使用gotip来达到下载master分支代码的目的:$gogetgolang.org/dl/gotip$gotipdownloadFromhttps://go.googlesource.com/go*branchmaster->FETCH_HEAD44361140c0..d9fd38e68bmaster->origin/masterPreviousHEADpositionwas44361140c0embed:updateddocsforproposaltweaks...拉取完成后可以执行拉取的gotip版本Version(commit-id):$gotipversiongoversiondevel+d9fd38e68bSatFeb2703:03:292021+0000darwin/amd64确认gotip后是正常的,我们可以编写如下通用示例代码:funcPrint[Tany](s[]T){for_,v:=ranges{fmt.Print(v)}}funcmain(){Print([]string{"脑洞大开,","炸鱼\n"})}如果照常执行,会直接提示无法识别某些泛型类型的标识符:$gotiprunmain.go#command-line-arguments./main.go:7:6:missingfunctionbody./main.go:7:11:syntaxerror:unexpected[,expecting(结合上面分析文本,需要指定-G标志来运行它。如下:$gotiprun-gcflags=all=-G=3main.go#command-line-arguments./main.go:7:6:internalcompilererror:Cannotexportgenericfunction(yet):Print显然,进入泛型逻辑是正确的我去了,虽然高兴的报错了,但是MatthewDempsky说这很正常,毕竟Go泛型还处于开发阶段。有朋友可能会注意到,-G指定了3,和上面不一致。这和早期编码有关:提到了CL变化,但是代码有冲突,需要解决。综上所述,Go语言的通用开发规划是比较清晰的。先合并到master分支,然后逐步完成开发,逐步开放。然后调整-G的默认值,最后完善generic后默认开启,彻底去掉-G标志。详细点,是不是跟Gomodules的方向类似?一开始需要手动开启GO111MODULE(即默认关闭),后来在Go1.16中GO111MODULE默认开启。这样就完成了一个正反馈循环,逐步开放,接受社区反馈和开发调整。总之,Go泛型指日可待。
