go的泛型草案已经出来一段时间了,喜欢尝鲜的朋友想必早都已经体验过了。但是基本也都是在playground上小小的尝试了一下。在playground上只能把所有代码写在一个文件里,那有没有方法体验一下在真正的项目中应用泛型呢?答案是有的,那就是go2go。
go2go是go源码中的一个分支,它并不是真正的支持了泛型,只是把泛型代码翻译成普通go代码,然后再编译的。后续go会真正从编译器的层面上支持泛型。
安装
首先拉取分支代码:
git clone https://github.com/golang/go -b dev.go2go
拉取源码后进行编译,编译要求首先已经安装了go的正式版本。同时也需要用到gcc等C语言编译器,当然如果没有用到cgo的需求,可以通过设置环境变量CGO_ENABLED=0来禁用cgo。
cd go2go/src ./all.bash // on windows, use all.bat
执行过程可能遇到下面这样的错误:
这是因为编译时默认使用的是$HOME/go1.4作为GOROOT,可以通过环境变量GOROOT_BOOTSTRAP来设置已存在版本的go的GOROOT。
export GOROOT_BOOTSTRAP=/usr/local/go # 或 export GOROOT_BOOTSTRAP=$GOROOT
all.bash会首先执行所有的单元测试,我在测试net包的时候测试失败了,具体原因还没有查(不影响编译)。嫌弃测试执行时间长或者也测试失败的,可以执行make.sh跳过测试步骤直接进行编译。
编译完成后,可以在go2go/bin目录下看到有go和gofmt文件。
使用go编译一个泛型函数后会发现编译失败了。那么为什么失败呢?go2go又去哪了呢?查看go2go/README.go2go.md文件可以看到正确的用法应该是
go tool go2go run x.go2
而go tool 实际是调用了GOPATH/pkg/tool/GOOS_GOARCH下面的程序,查看这个目录,果然可以发现go2go了。
其实不用go tool xxxx,直接执行这些程序也是可以正常使用的。
为了兼容不同版本的go以及方便使用,可以在PATH下创建个脚本go2go,并赋可执行权限:
#!/bin/bash export GOROOT=/usr/local/go2go export GO2PATH=~/go2 $GOROOT/pkg/tool/linux_amd64/go2go $@
再使用就可以在任意位置直接go2go run xx.go2了,是不是方便多了。