其实Go 1.17 就支持泛型了,具体该怎么用呢?

Go1.17已包含泛型功能,可通过-G标志进行实验性使用。本文介绍了如何升级到Go1.17,以及如何编写和运行泛型代码。通过示例代码展示了泛型在处理不同类型数据时的便利性,并提供了GitHub资源供进一步学习。尽管目前存在一些限制,如不能导出通用函数,但开发者可以开始尝试和适应Go的泛型语法。
摘要由CSDN通过智能技术生成

千呼万唤的,Go1.17 上个月终于发布了:

788acec6259e21d6d6a87db1b757d7cb.png
图片

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

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

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

升级 Go1.17

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

2c95539de865618319c9a992cb052bfa.png
图片

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

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{1, 2, 3})
}

只需要在 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 整理了完整的泛型使用案例后开源了,可以实际下载使用看看:

cccac722141fb20f8a1b63570db7616f.pnggithub.com/mattn/go-generics-example

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

总结

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

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

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

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

bc4d0af771ce711abb97cd17b064ffd4.png

煎鱼--Go圈知名博主,大学搞过 PHP。现在整 Go,在公司负责微服务架构等相关工作推进和研发。更是出版了 Go 畅销书《Go 语言编程之旅》,点击蓝字查看他的出书之路

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值