Go语言泛型工具go2go

背景

Go语言从1.18开始,初步支持泛型。要探索Go是如何实现泛型的,就需要使用工具go2go,这里介绍下如何编译该工具。

正文

go2go是以工具的形式来使用的,可通过go tool go2go <subcommand>来执行命令。
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/
addr2line  api  asm  buildid  cgo  compile  cover  dist  doc  fix  go2go  link  nm  objdump  pack  pprof  test2json  trace  vet

可以看到目录下有go2go工具,可以直接使用该二进制文件,也可以通过go tool go2go来调用。如果要通过go tool go2go来调用,则需要把新编译出的go可执行文件加入到PATH中。

验证

创建代码文件GenericsSimple.go2

package main

import "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.go  GenericsSimple.go2

查看该文件,感受下Go语言泛型是如何实现的吧。

引用

https://go.dev/doc/install/source

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值