背景 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
推荐阅读
- golang|golang泛型介绍
- golang|Go 泛型
- Golang|Go 1.18 泛型详解: 从零读懂泛型
- golang|Go 泛型的使用
- GO语言|Go1.8 泛型简单上手使用
- golang|Go1.18版本泛型详解
- GO学习笔记|go泛型使用方法
- 【第四十三期】社招面经-后端开发 蚂蚁
- 【第十三期】B站后端开发实习生一、二面经