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

图片

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

  • 一个新细节,Go 1.17 将允许切片转换为数组指针!

  • 我要提高 Go 程序健壮性,Fuzzing 来了!

  • 提了 3 年,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{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): PrintPlease 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 工程的写法。

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

关注煎鱼,吸取他的知识 

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

  1. java支持泛型_Java自学-泛型 支持泛型的类

    Java 如何设计支持泛型的类 步骤 1 : 不支持泛型的Stack 以Stack栈为例子,如果不使用泛型 当需要一个只能放Hero的栈的时候,就需要设计一个HeroStack 当需要一个只能放Ite ...

  2. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

  3. linux内核多大 4.17.8,Linux Kernel 4.17结束支持,请升级到Linux 4.18内核

    Linux Kernel 4.17最后一个更新是Linux Kernel 4.17.19内核,该系列内核版本将结束支持,它不会再得到新的更新,请用户把Linux内核升级到4.18版本,这样能避免安全漏 ...

  4. 百度文心一言推出内测专用独立 App;暴雪回应被网易起诉:未收到相关诉状;iOS 17或支持第三方应用商店 | 极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) ...

  5. 腾讯各事业群裁员比例没有网传30%那么高;郭明錤称苹果汽车团队已解散;Go 1.18 发布,正式支持泛型|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分钟速览新闻点! 腾讯各事业群裁员比例没有网传30%那么高 ...

  6. eclipse不支持泛型_Go语言11岁了,网友:他喵的,终于确定出「泛型」了

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 比Python更快,比Java更简洁,还有C++没有的GC(垃圾收集). 谷歌开发的编程语言Go,迎来了它11岁的生日! 那么在这一年的时间 ...

  7. eclipse不支持泛型_C++ 泛型编程(一)

    点击上方"蓝字",发现更多精彩.本文作为泛型编程相关知识点的第一篇,主要对一些基本概念进行总结.泛型编程01PART基本概念①.泛型就是不使用具体数据类型,而是使用一种通用类型 T ...

  8. 密封类的permits语法不支持泛型参数

    how-to-use-sealed-classes-with-generics 没加泛型参数前eclipse有警告,只能加上@SuppressWarnings("rawtypes" ...

  9. 虚拟机Parallels Desktop 17 (PD17)支持M1 自己动手制作启动器解锁

    个人博客:xzajyjs.cn 如果自己有能力的话,直接查看这个视频即可.点此 前段时间刚出pd17,作为mac上最最强(没有之一)的虚拟机,版本17更是更进一步,性能提升极大,更是支持了Monter ...

最新文章

  1. 深入探讨Varnish缓存命中率
  2. 在浙学计算机基础2020答案,浙江大学2020年硕士研究生复试分数线的基本要求
  3. 直播马上开始│走进腾讯云物联网
  4. 程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)
  5. 【LuoguP5004】 专心OI - 跳房子
  6. 新加入一个团体,如何能尽快的展开测试工作(转载)
  7. c语言1234为什么不是常量,C语言学习1
  8. PHP nodejs session,Nodejs中session的简单使用及通过session实现身份验证的方法
  9. 接口(Api)版本号命名规则
  10. html当当图书榜页面,2019书排行榜_当当网图书排行榜
  11. 傅立叶变换变换matlab,希尔伯特变换和傅里叶变换MATLAB仿真
  12. 阿里云ACA试题-云安全典型题19道
  13. ubuntu codename
  14. 笔记本散热不好怎么办
  15. 代码 马佳义_212电子信息学院(2018年度)
  16. 小游戏 《唐僧大战白骨精》
  17. 容器云技术docker
  18. 什么是人工智能,人工智能的求职条件是什么?
  19. 在Windows中开启Wifi热点共享,无需第三方工具
  20. selenium切换窗口的几种方法小结

热门文章

  1. Go语言游戏服务器思维导图
  2. Yii2 源码分析 - 入口文件执行流程
  3. 今天讲讲hibernate的简单使用
  4. 如何对CAD进行区域覆盖
  5. linux 文件重命名或文件移动
  6. 机器学习和统计模型的差异
  7. Python函数的参数传递方式
  8. 流程 - 发布【敏捷方法之Scrum v0.2.pdf】
  9. 怎样才能有德国煤矿那样严密的安全网?
  10. scikit-learn学习之贝叶斯分类算法