Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|聊聊最近大热的Go泛型

https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
避免过早使用泛型
不同类型实现各不相同
全部操作仅调用一个方法
编写通用数据结构
操作slice、map、channel等特定类型
泛型未带来额外运行时负担
Go标准库sort包 vs. 泛型版Sort函数
使用前需先具化
类型也可以有类型参数
自动推导类型参数
泛型函数具化为新函数
规定类型实参必须满足的条件
使用interface定义
通过方括号括起
作为未知类型的占位符
2021年12月14日:发布Go 1.18beta1
2020年6月:Featherweight Generic Go(FGG)
简化contract语法
2018年8月:引入contract关键字
解决泛型、包依赖、错误处理等问题
2010-2016:多版泛型设计方案
2009年12月3日:提出泛型实现方法
影响编译器性能
增加语言复杂性
避免类型断言和反射
提升开发效率
提高代码复用性
泛型:使用类型参数实现算法复用
非泛型:针对不同类型重复实现
实现算法的广泛复用
将算法与类型解耦
缪斯·大卫和斯捷潘诺夫.亚历山大的“泛型编程”一文
泛型多年霸榜
延迟发布以确保稳定性
Go开源以来最大的语法特性变化
2022年3月:Go 1.18最终版本
2022年2月:Go 1.18RC
阅读Go泛型的技术方案
Go泛型的成熟与稳定需要时间
Go 1.18是泛型的起点
Go泛型是Go语言发展的重要里程碑
不宜使用泛型
适合使用泛型
性能基准测试
泛型类型
类型具化(instantiation)
约束(constraint)
类型参数(type parameter)
Go 1.18正式支持泛型
菲利普·瓦德勒的论文
伊恩·泰勒的GopherCon 2019演讲
Go2 draft proposal
Russ Cox的GopherCon 2017演讲
伊恩·泰勒的设计方案
Russ Cox的探索
挑战
优势
加法函数
核心思想
来源
Go社区强烈需求
Go官方用户调查
引入泛型
发布计划
思考题
小结
Go泛型的使用建议
Go泛型的性能
Go泛型的基本语法
Go泛型的设计历史
泛型的优势与挑战
泛型的实现示例
泛型的概念
泛型的需求
Go 1.18版本发布
Go泛型

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
美国时间 2022 年 1 月 31 日,在中国人民欢庆虎年春节之际,Go 核心团队发布了Go 1.18 Beta2 版本。在 Go 1.18beta2 版本发布的博文中,Go 核心团队还给出了 Go 1.18 版本的发布计划:2022 年 2 月发布 Go 1.18RC(release candidate,即发布候选版),2022 年 3 月发布 Go 1.18 最终版本
考虑到 Go 1.18 版本中引入了 Go 语言开源以来最大的语法特性变化:泛型(generic),改动和影响都很大,Go 核心团队将 Go 1.18 版本延迟一个月,放到 3 月发布也不失为稳妥之举。
在 Go 泛型正式落地之前,我想在这篇加餐中带你认识一下 Go 泛型,目的是“抛砖引玉”,为你后续系统学习和应用 Go 泛型语法特性开个头儿。
我们今天将围绕 Go 为什么加入泛型、泛型设计方案的演化历史、Go 泛型的主要语法以及 Go 泛型的使用建议几个方面,聊聊 Go 泛型的那些事儿。
首先,我们先来了解一下 Go 语言为什么要加入泛型语法特性。

为什么要加入泛型?

根据近几年的 Go 官方用户调查结果,在“你最想要的 Go 语言特性”这项调查中,泛型霸榜多年。你可以看下这张摘自最新的2020 年 Go 官方用户调查结果的图片:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言在2022年3月发布了Go 1.18版本,其中最引人关注的特性是泛型。泛型编程的中心思想是对具体的、高效的算法进行抽象,以获得通用的算法,然后这些算法可以与不同的数据表示法结合起来,产生各种有用的软件。Go语言加入泛型的原因是因为社区对泛型特性的需求强烈,但在早期并未将其作为设计目标,因为泛型会给语言带来复杂性,与Go语言的简单设计哲学有所冲突。在即将发布的Go 1.18版本中,泛型语法特性将正式落地。泛型的引入将使得算法更广泛地复用,解决了在没有泛型的情况下需要针对不同类型重复实现相同算法逻辑的问题。 Go泛型的设计经历了多年的探索和演化。从最初的三种可遵循的泛型实现方法,到伊恩·泰勒和罗伯特·格瑞史莫提出的多个设计方案,再到菲利普·瓦德勒的泛型语法设计,Go团队不断寻找理想的泛型设计方案。最终,Go泛型的基本语法经过12年的努力与不断地自我否定,终于在2021年12月14日正式支持。泛型的引入为Go语言带来了重大变革,使得算法更加灵活和通用,同时也没有违背Go1的兼容性。 Go泛型的引入并未影响程序运行时性能,反而提高了程序员的开发效率和算法的重用性。在性能基准测试中,泛型版的Sort函数表现出与非泛型版相当的性能,并且在排序过程中没有额外的内存分配。然而,Go 1.18编译器的性能下降了约15%,但Go核心团队承诺将在Go 1.19中改善编译器的性能。 Go团队建议在编写函数的操作元素的类型为slice、map、channel等特定类型,或者编写通用数据结构时使用泛型。但不宜在对某一类型的值进行全部操作时使用泛型,或者当不同的类型使用一个共同的方法时,如果每种类型的实现各不相同时也不宜使用泛型。 总的来说,Go泛型的引入标志着Go语言在语法层面的最大一次变动,为Go社区解决了重要问题,也为未来的软件开发提供了更多可能性。 Go泛型方案对Go程序的运行时性能也带来了积极影响。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • bearlu
    老师,GO的实现泛型方式是跟C++一样?编译时进行?

    作者回复: 可以确定:编译时对泛型做的处理。但go使用的是一个hybrid方案,我也没太深挖。后续深挖后,再给大家分享。

    2022-02-09
    4
    3
  • Rayjun
    白老师太强了,能够把复杂的问题通过简单的方式讲述出来,太值得学习了

    作者回复: 谬赞了😁

    2022-02-18
    2
  • lesserror
    Tony bai 老师,有几个小问题: 1. 类型参数是在函数声明、方法声明的 receiver 部分或类型定义的类型参数列表中,声明的(非限定)类型名称。 这里的非限定应该怎么理解呢?我的理解是命名可以随意。 2. 文中:“根据 Go 泛型的实现原理,上面的泛型函数调用 Sort[book](bookshelf)会分成两个阶段。” 这里(bookshelf)里面有一个链接,但是链接打开的是极客时间首页,不知道这里原意是什么。 3. 用类型参数替换接口类型通常也会让数据存储的更为高效。 这里为什么变高效了?能大致讲讲吗?

    作者回复: 1. 不是命名,是类型限定。可以是非限定的any之类的。当然也可以是限定的,比如comparable。当然这篇写的比较早,这块可以去掉“非限定”这个括号中的定语。 2. 那应该是极客时间编辑器从markdown转换文字时的问题。 3. 可以看看泛型篇的最后一讲。并对比interface在runtime层的表示原理。

    2023-08-02归属地:广东
    1
  • 左耳朵东
    1、"没有必要像下面代码中这样使用一个类型参数像调用 Read 方法那样去从一个值中读取数据" 这里没看明白。 2、不考虑使用效果的话,能用泛型的地方好像都能用接口替换,反之也是,有点难以区分。 3、可不可以这样理解,如果某个功能只有一种实现方式,但是可以用在多种数据类型上,就用泛型;如果某个功能有多种实现方式(用不同的数据类型,会导致实现方式有差别),最好用接口。比如 io.Read 要求可以读文件 I/O 也可以读网络 I/O,它们各自的实现方式其实不一样,最好用接口而不是泛型。

    作者回复: 问题1 本来直接用接口类型即可,没必要在用接口类型作为constraint类型,用泛型没有任何额外好处,反增加了复杂性。 关于when用泛型,41讲说的更全面细致,可去读读。

    2023-07-26归属地:广东
    1
  • coming
    习惯了C++的泛型, 看着[](), 有点懵

    作者回复: 的确需要适应一段时间。

    2023-02-07归属地:上海
    1
  • 雪飞鸿
    go团队没有找安德斯•海尔斯伯格聊聊~
    2022-09-11归属地:江苏
  • 总有刁民想害朕
    泛型支持依赖注入就好了
    2022-04-24
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部