Go语言之父介绍泛型

Posted OSC开源社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言之父介绍泛型相关的知识,希望对你有一定的参考价值。


x < y
x

y

if x < y
return x

return y
提供类型参数,在这种情况下Tree[T
left, right *Tree[T]
value T


* ...

stringTree Tree[string]
在上面的例子中,泛型类型Tree存储了类型形参T的值。泛型类型也可以有方法,比如本例中的Lookup。为了使用泛型类型,它必须被实例化;Tree[string]是使用类型实参string来实例化Tree的示例。

类型推断

此项功能是最复杂的变更,主要包括:

  • 函数参数类型推断 (Function argument type inference)

  • 约束类型推断 (Constraint type inference)

  • 虽然类型推断的工作原理细节很复杂,但使用它并不复杂:类型推断要么成功,要么失败。如果它成功,类型实参可以被省略,调用泛型函数看起来与调用普通函数没有什么不同。如果类型推断失败,编译器将给出错误消息,在这种情况下,只需提供必要的类型实参。

    泛型是 Go 1.18 的重要新语言特性,Robert Griesemer 和 Ian Lance Taylor 表示,这个功能实现得很好并且质量很高。虽然他们鼓励在有必要的场景中使用泛型,但在生产环境中部署泛型代码时,请务必谨慎。
    更多介绍查看原文:https://go.dev/blog/intro-generics

    推荐阅读



    谷歌Fuchsia OS负责人离职,网友:被鸿蒙挖走了?

    苹果有开源(上):乔布斯的复仇衍生品Darwin

    微软再陷抄袭风波


    觉得不错,请点个在看

    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语言之父介绍泛型的主要内容,如果未能解决你的问题,请参考以下文章

    Go语言泛型工具go2go

    Go语言泛型工具go2go

    Go语言之父:发明过航天望远镜,想用Go语言解放程序员!

    Go语言之父:四十年来软件开发之巨变与Go的过去和未来

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

    Go 语言泛型编程之切片