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

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

你好,我是 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

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

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

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

    作者回复: 谬赞了😁

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

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

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

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

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

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

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