Go语言泛型工具go2go

Posted styshoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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([]int1, 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

以上是关于Go语言泛型工具go2go的主要内容,如果未能解决你的问题,请参考以下文章

如何看待go语言泛型的最新设计?

Go 语言泛型编程之切片

Go 1.18 终于来了!

Go语言11周年,泛型问题有望明年得到解决

Go语言之父介绍泛型

go语言 从结构体中获取某个字段的值(反射+泛型)