令人激动!Go 泛型代码合入 Master(附尝鲜方法)

开发 后端
在 GopherCon 2020 Go Team AMA 时,要在今年底要能有生产环境的试用版上线,这是 rsc 所提出的一个管理目标。

[[384484]]

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。

大家好,我是慢一拍的后方记者煎鱼。

按照先前官方和文章的说法,Go 泛型预计是在 Go1.18 正式释出。

 

在 GopherCon 2020 Go Team AMA 时,要在今年底要能有生产环境的试用版上线,这是 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,支持泛型。

在完成 types2 的错误和现有的错误的开发协调后,计划在 Go 1.17 将 -G=1 设置为默认值。

未来也许可以在 Go 1.18 中放弃对 -G=0 的支持,这样后续在默认启用 -G=2 上会变得更容易。

在 Go1.17 尝鲜

在 Go1.17 尝鲜,也就意味着需要拉取 Go 语言的 master 分支的代码,Go1.17 现在正处于开发阶段:

 

我们可以通过 gotip 来达到下载 master 分支代码的目的:

  1. $ go get golang.org/dl/gotip 
  2. $ gotip download 
  3. From https://go.googlesource.com/go 
  4.  * branch            master     -> FETCH_HEAD 
  5.    44361140c0..d9fd38e68b master     -> origin/master 
  6. Previous HEAD position was 44361140c0 embed: update docs for proposal tweaks 
  7. ... 

在拉取完毕后可以执行 gotip version 查看所拉取的版本(commit-id):

  1. $ gotip version 
  2. go version devel +d9fd38e68b Sat Feb 27 03:03:29 2021 +0000 darwin/amd64 

在确定 gotip 正常后,我们就可以编写泛型的示例代码了,如下:

  1. func Print[T any](s []T) { 
  2.  for _, v := range s { 
  3.   fmt.Print(v) 
  4.  } 
  5.  
  6. func main() { 
  7.  Print([]string{"脑子进, ""煎鱼了\n"}) 

如果执行像往常那样执行,是会直接提示无法识别泛型的一些标识符:

  1. $ gotip run main.go  
  2. # command-line-arguments 
  3. ./main.go:7:6: missing function body 
  4. ./main.go:7:11: syntax error: unexpected [, expecting ( 

结合上文的解析,我们需要指定 -G 标识,就可以运行了。如下:

  1. $ gotip run -gcflags=all=-G=3 main.go  
  2. # command-line-arguments 
  3. ./main.go:7:6: internal compiler error: Cannot export a generic function (yet): Print 

显然,正确的走进泛型的逻辑里去了,虽然愉快的报错了,但 Matthew Dempsky 表示这很正常,毕竟 Go 泛型还在开发阶段。

可能会有的小伙伴注意到,-G 指定的是 3,与前文所述不符。这与早期的编码有关:

 

已经提了 CL 变更,只是代码冲突了,待解决。

总结

Go 语言的泛型开发计划已经比较明确。首先合入 master 分支,再逐步完成开发,逐步开放。

再进行 -G 默认值的调整,最后在泛型完善后就默认开启,把 -G 标识彻底去掉。

细品,与 Go modules 的方向是不是差不多。一开始 GO111MODULE 需要手动开启 on(也就是默认 off),再到 Go1.16 GO111MODULE 默认为 on。

以此完成了一个正反馈的循环,逐步开放,接受社区反馈和开发调整。

 

结论,Go 泛型指日可待了。

 

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2018-06-12 16:47:35

语音UI音箱

2020-04-10 14:15:27

Ubuntu 20.0Linux命令

2016-03-23 10:06:18

2013-02-25 10:02:40

HTML5Web

2013-07-24 17:28:02

HTML5预测

2013-02-25 09:16:12

HTML5WebCSS

2022-05-02 14:53:59

Plasma桌面环境KD

2021-09-29 18:17:30

Go泛型语言

2023-11-29 08:19:45

Go泛型缺陷

2010-01-13 16:44:03

C++

2024-10-28 00:40:49

Go语法版本

2022-03-28 13:34:26

Go泛型部署泛型

2021-11-27 22:20:13

SlicesGo泛型

2023-11-03 14:02:04

Go切片泛型库

2021-12-15 10:23:56

Go 1.18 Bet语言泛型

2021-12-05 23:45:23

Go泛型Maps

2022-04-15 09:55:59

Go 泛型Go 程序函数

2022-03-29 11:48:40

Go泛型测试

2021-12-01 08:29:17

Go泛型Maps

2021-01-14 05:20:48

Go语言泛型
点赞
收藏

51CTO技术栈公众号