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

39 | 驯服泛型:了解类型参数

泛型类型内嵌类型参数目前不支持
可嵌入普通类型或泛型类型实例
仅实例化后的类型可创建别名
Go 1.19不支持自动推断
需要显式传递类型实参
实例化后的函数复用
根据类型实参生成新函数
目前不支持声明自己的类型参数列表
使用泛型类型的类型参数
泛型类型的方法
类型嵌入
类型别名
实例化过程
类型参数列表位于类型名后方括号中
带有类型参数的自定义类型
实例化过程
类型实参自动推断
显式传递类型实参
返回值列表使用类型参数
参数列表使用类型参数
类型参数列表 [T constraint]
类型形参与类型实参
类型参数列表位于函数名与参数列表之间
带有类型参数的函数
为什么Go使用方括号[]而非尖括号<>声明类型参数
编译阶段的类型检查增加安全性
泛型相比于interface{}有更好的性能
特性
定义
特性
使用
定义
调用
结构
定义
泛型使得代码与类型解耦
Go泛型方案实质是对类型参数的支持
思考题
性能考量
泛型方法
泛型类型
泛型函数
泛型概念
Go 泛型基本语法:类型参数

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

你好,我是 Tony Bai。
在专栏的结束语中,我曾承诺要补充“泛型篇”,帮助你入门 Go 泛型语法。在经历了 2022 年 3 月 Go 1.18 版本的泛型落地以及 8 月份 Go 1.19 对泛型问题的一轮修复后,我认为是时候开讲 Go 泛型篇了
虽说目前的 Go 泛型实现和最后一版的泛型设计方案相比还有差距,依旧不是完全版,还有一些特性没有加入,还有问题亟待解决,但对于入门 Go 泛型语法来说,我认为已经是足够了。
不过在正式开讲之前,我还有一些友情提示:和支持泛型的主流编程语言之间的泛型设计与实现存在差异一样,Go 的泛型与其他主流编程语言的泛型也是不同的。我希望你在学习之前,先看一下 Go 泛型设计方案已经明确不支持的若干特性,比如:
不支持泛型特化(specialization),即不支持编写一个泛型函数针对某个具体类型的特殊版本;
不支持元编程(metaprogramming),即不支持编写在编译时执行的代码来生成在运行时执行的代码;
不支持操作符方法(operator method),即只能用普通的方法(method)操作类型实例(比如:getIndex(k)),而不能将操作符视为方法并自定义其实现,比如一个容器类型的下标访问 c[k];
不支持变长的类型参数(type parameters)
… …
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言泛型的基本语法及应用是本文的重点内容。作者通过示例展示了使用any类型和类型断言实现通用函数的不足之处,并介绍了Go 1.18版本中引入的泛型语法,展示了如何使用类型参数来实现通用函数。通过对比性能测试,作者展示了泛型版本函数相对于使用any类型的函数在性能上的优势。文章还强调了Go泛型适合解决容器类型算法的特点,并指出泛型实现使得容器算法与容器内元素类型彻底解耦。此外,文章还介绍了泛型函数的实例化过程和泛型类型的声明和使用方法,为读者提供了全面的泛型知识。在泛型类型的支持方面,文章提到了类型别名和类型嵌入的情况,并对泛型方法的定义和使用进行了详细讲解。总的来说,本文为读者提供了一个深入了解Go泛型基本语法及应用的入门指南,适合对Go泛型感兴趣的读者阅读学习。

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

全部留言(9)

  • 最新
  • 精选
  • 那时刻
    go语言范型不使用 <>,我想到一个点,是不是解析的时候 容易与大于 或者小于 符号混淆?

    作者回复: 👍

    2022-11-10归属地:北京
    3
    3
  • 文武木子
    沙发🛋️

    作者回复: 👍

    2022-11-04归属地:北京
    3
  • 左耳朵东
    既然泛型函数的实例化是在编译阶段做的,实例化生成的也是一个普通函数,怎么压测结果比普通函数要慢呢,不知道哪里多出来的性能损耗?

    作者回复: 第41讲有泛型原理的讲解,那里可以找到答案。

    2023-07-27归属地:广东
    2
  • 麦子
    go语言范型不使用 <> 难道和组合有关系,为了统一?类似[]int

    作者回复: 不是。是在编译阶段的技术问题,根据go团队说法,如果用<>,则会在编译阶段词法和语法解析的时候,产生无法化解的歧义。

    2023-11-27归属地:江苏
    1
  • return
    白老师一如既往的超高质量,感谢老师的无私奉献。

    作者回复: 👍

    2022-11-17归属地:北京
    1
  • 一打七
    还好时不时复习一下老师的课,又等到老师更新了,意外之喜

    作者回复: 欢迎常回来看看:)

    2022-11-08归属地:北京
    1
  • 罗杰
    最近打算看看泛型,然后就看到了老师的更新,非常及时。不过,看起来并没有那么容易,老师写的很详细,需要好好消化一下。

    作者回复: 哈哈,居然是及时雨:)

    2022-11-06归属地:北京
    1
  • Calvin
    终于等到你,还好你没放弃。😂 白老师的课程一如既往的高质量,这篇文章补充了我很多关于泛型的未知知识点。

    作者回复: 👍

    2022-11-05归属地:北京
    1
  • 吃橘子的汤圆🐳
    感谢
    2023-02-26归属地:河南
    1
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部