Go|Go语言泛型工具go2go

背景 Go语言从1.18开始,初步支持泛型。要探索Go是如何实现泛型的,就需要使用工具go2go,这里介绍下如何编译该工具。
正文 go2go是以工具的形式来使用的,可通过go tool go2go 来执行命令。
Go的工具链由Go语言编写,所以需要提前安装GO,并配置好GOPATH等。
下载代码 代码在Go语言源码的dev.go2go分支,该分支于2020年发布,现在已经不再维护。
代码量偏大,如果网络不佳,可以考虑通过gitee来中转。

git clone https://github.com/golang/go -b dev.go2go

编译代码 下载完成就可以直接编译了,Windows和Linux都可以,这里我们以Linux为例。
如果服务器上没有gcc工具,又不需要cgo功能,可设置CGO_ENABLED=0,否则在编译时会报找不到gcc的错误。
开始编译。
cd go/src CGO_ENABLED=0 ./all.bash... ALL TESTS PASSED --- Installed Go for linux/amd64 in /root/sty/go Installed commands in /root/sty/go/bin *** You need to add /root/sty/go/bin to your PATH.

如果一切顺利,编译结束后就会生成go可执行文件以及工具(包括go2go)。
# ls pkg/tool/linux_amd64/ addr2lineapiasmbuildidcgocompilecoverdistdocfixgo2golinknmobjdumppackpproftest2jsontracevet

可以看到目录下有go2go工具,可以直接使用该二进制文件,也可以通过go tool go2go来调用。如果要通过go tool go2go来调用,则需要把新编译出的go可执行文件加入到PATH中。
验证 创建代码文件GenericsSimple.go2
package mainimport "fmt"func Print[T any](s []T) { for _, v := range s { fmt.Println(v) } }func main() { Print([]int{1, 3}) Print([]string{"Book", "Wendy"}) }

使用go2go工具来生成代码。
# go tool go2go GenericsSimple.go2

执行完成后,就会在同一目录,生成名为GenericsSimple.go的代码文件,该文件,就是Go编译器将原泛型相关代码转换成的最终代码文件。
# ls GenericsSimple.goGenericsSimple.go2

查看该文件,感受下Go语言泛型是如何实现的吧。
引用
【Go|Go语言泛型工具go2go】https://go.dev/doc/install/source

    推荐阅读