这类提前放入主版本的操作,在 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 分支代码的目的:
$ 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 ...
在拉取完毕后可以执行 gotip version 查看所拉取的版本(commit-id):
$ gotip version go version devel +d9fd38e68b Sat Feb 27 03:03:29 2021 +0000 darwin/amd64
在确定 gotip 正常后,我们就可以编写泛型的示例代码了,如下:
func Print[T any](s []T) { for _, v := range s { fmt.Print(v) } }
func main() { Print([]string{"脑子进, ", "煎鱼了\n"}) }
如果执行像往常那样执行,是会直接提示无法识别泛型的一些标识符:
$ gotip run main.go # command-line-arguments ./main.go:7:6: missing function body ./main.go:7:11: syntax error: unexpected [, expecting (
结合上文的解析,我们需要指定 -G 标识,就可以运行了。如下:
$ 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
显然,正确的走进泛型的逻辑里去了,虽然愉快的报错了,但 Matthew Dempsky 表示这很正常,毕竟 Go 泛型还在开发阶段。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。