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泛型,泛了,但没有完全泛

通过实现 Get/Set 方法的接口来约束类型
解决泛型约束只能是接口而不能是结构体的限制
通过私有方法实现标记接口
解决泛型约束不能用作类型声明的限制
过程式设计,Client + Builder
适用于客户端类中间件 API 设计
3. 对放开 Go 泛型限制的看法
2. 开源软件维护者暴露泛型 API 的需求
1. 中间件开发对泛型的改造意愿
泛型普及可能会有一段遥远的距离
解决思路效果不错,但不够优雅
泛型使用场景受限
Getter/Setter 接口
标记接口
Builder 模式
泛型约束只能是接口,而不能是结构体
泛型约束不能作为类型声明
Go 接口和结构体不支持泛型方法
思考题
总结
解决思路
Go 泛型的局限
Go 泛型的局限与解决思路

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

你好,我是大明,一个专注于中间件研发的开源爱好者。
我们都知道,Go 泛型已经日渐成熟,距离发布正式版本已经不远了。目前已经有很多的开发者开始探索泛型会对 Go 编程带来什么影响。比如说,目前我们比较肯定的是泛型能够解决这一类的痛点:
数学计算:写出通用的方法来操作 intfloat 类型;
集合类型:例如用泛型来写堆、栈、队列等。虽然大部分类似的需求可以通过 slicechannel 来解决,但是始终有一些情况难以避免要设计特殊的集合类型,如有序 Set 和优先级队列;
slicemap 的辅助方法:典型的如 map-reduce API;
但是至今还是没有人讨论 Go 泛型的限制,以及这些限制会如何影响我们解决问题。
所以今天我将重点讨论这个问题,不过因为目前我主要是在设计和开发中间件,所以我会侧重于中间件来进行讨论,当然也会涉及业务开发的内容。你可以结合自己了解的 Go 泛型和现有的编程模式来学习这些限制,从而在将来 Go 泛型正式发布之后避开这些限制,写出优雅的 Go 泛型代码。
话不多说,我们现在开始讨论第一点:Go 泛型存在哪些局限。

Go 泛型的局限

在早期泛型还处于提案阶段的时候,我就尝试过利用泛型来设计中间件。当然,即便到现在,我对泛型的应用依旧提留在尝试阶段。根据我一年多的不断尝试,以及我自己对中间件开发的理解,目前我认为影响最大的三个局限是:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go泛型技术的局限性及解决方案 Go泛型技术已经成熟,但仍存在一些限制。本文讨论了三个主要局限:Go接口和结构体不支持泛型方法,泛型约束不能作为类型声明,以及泛型约束只能是接口,不能是结构体。作者以中间件开发为例,详细分析了这些限制对中间件设计和开发的影响。他指出,这些限制对客户端类应用不友好,且无法在编译期检查用户输入类型是否正确。文章提出了一些解决方案,包括Builder模式、标记接口和Getter/Setter接口。这些解决思路虽然有效,但并不够优雅。作者对Go泛型的普及持有一种比较悲观的态度,认为泛型从出来到大规模应用还有一段非常遥远的距离。文章深入浅出地解释了Go泛型的局限性,对于想要了解Go泛型技术特点的读者具有很高的参考价值。

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

全部留言(5)

  • 最新
  • 精选
  • yandongxiao
    不知道是从哪里看到的。 什么时候要使用泛型? 1. write code do not design types. 先写函数,别着急一上来就写泛型,函数泛型化是比较简单的。 2. Functions that work on slices, maps, and channels of any element type. 那些不在乎容器内的元素类型的函数。 3. general purpose data struct,算法,例如,链表、二叉树等。 4. when a method looks the same for all types。当你发现你不得不实现一段重复的逻辑时,就可以考虑泛型。

    作者回复: 👍 之前Go团队做个speak,也写过blog,介绍该如何用泛型,以及不要滥用泛型。

    2022-04-12
    4
  • 洛书
    最不可接受的是使用[]作为泛型类型声明, [] 本身已经作为slice,array,map的索引操作符,而且大多数人都有别的语言开发的经验,下意识会把[]当作下表解释. 这才是心智负担. 而使用<>就没有这个问题. 标新立异?

    作者回复: 据我说知不是标新立异。这和go编译器解析<>的二义性有关。go编译器只扫描一遍代码,无法在上下文中判断<>究竟是啥,是泛型声明还是大小于号。

    2022-02-22
  • pike
    当你要为不同的类型写相同逻辑的代码,泛
    2022-10-16归属地:上海
  • 洛书
    type Vector[T any] []T type Vector<T any> []T type Vector[T any] [][]T type Vector<T any] [][]T 孰优孰劣,不难看出,不明白为什么头铁的采用[]包裹泛型声明, 标新立异?
    2022-02-22
  • 罗杰
    看起来限制还是非常多,不过对我而言,泛型几乎都没有使用场景。
    2022-02-11
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部