Go 1.17 支持泛型了?具体怎么用

2021/08/23 08:16
阅读数 538

大家好,我是煎鱼。

千呼万唤的,Go1.17 前几天终于发布了:

先前我写了几篇 Go1.17 新特性的文章,有兴趣的小伙伴可以看看:

今天的主题是泛型,众所皆知 Go1.18 泛型就会正式释出,都很期待,毕竟大更新,所有配套都会陆续有来!其实,在 Go1.17 的此刻其实可以使用泛型了,泛型代码已合入 master 分支。

咱们只需要一点点操作,就能提前过上 Go 泛型的实验生活了。

升级 Go1.17

你需要先升级 Go1.17,如下图:

安装后查看版本信息是否正常输出:

go1.17 version
go version go1.17 darwin/amd64

使用泛型

接着写入一个基本的泛型 Demo:

import (
 "fmt"
)

func Print[T any](s []T) {
 for _, v := range s {
  fmt.Print(v)
 }
}

func main() {
 Print([]string{"你好, ""脑子进了煎鱼\n"})
 Print([]int64{123})
}

只需要在 run 和 build 的命令执行时指定 -G 标识就好了。不过有的小伙伴可能会疑惑,为什么要这么干?

其实这类提前放入主版本的操作,在 Go 语言中并不少见。像是现在所见的 GO111MODULE,早期的 GO15VENDOREXPERIMENT 都有些这么个味道。都是逐步入场,分阶段使用,等确定成熟、完善后再渐渐去掉。

本次泛型也采取了这种方法,按照提案,目前使用的是 -G 标识做为泛型的开关。

运行的命令如下:

go1.17 run -gcflags=-G=3 xxx

就可以运行带有泛型的代码。

查看输出结果:

$ go1.17 run -gcflags=-G=3 generics.go
# command-line-arguments
./generics.go:7:6: internal compiler error: Cannot export a generic function (yet): Print

Please file a bug report including a short program that triggers the error.
https://golang.org/issue/new

竟然报错了,煎鱼你翻车了是吧...

根据错误提示可得知,是还没实现导出一个通用函数的功能。那样我们只需要把 Print 方法改为 print,再执行就可以了。

再次执行后的输出结果:

你好, 脑子进了煎鱼
123

成功输出了不同类型的值。

更多的案例

在 GitHub 有个小伙伴 mattn 整理了完整的泛型使用案例后开源了,可以实际下载使用看看:

github.com/mattn/go-generics-example

大家根据上面的介绍来实际使用就可以达到运行泛型的效果了,GitHub 地址是:github.com/mattn/go-generics-example。

总结

经过多年的折腾,Go 语言在发布的 1.17 版本中已经包含了泛型的功能。将会在 Go1.18 正式宣发泛型,我们将会是 Go 历史新阶段的见证者

为什么?因为随着 Go1.18 的逼近,我们将会将会见到越来越多的新工具支持和变更,甚至会改变不少 Go 工程的写法。

欢迎大家在评论区分享你的看法

关注煎鱼,吸取他的知识 👆



你好,我是煎鱼。高一折腾过前端,参加过国赛拿了奖,大学搞过 PHP。现在整 Go,在公司负责微服务架构等相关工作推进和研发。

从大学开始靠自己赚生活费和学费,到出版 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,记得点赞!

本文分享自微信公众号 - HHFCodeRv(hhfcodearts)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部