大咖助阵|大明:Go泛型,泛了,但没有完全泛
大明
该思维导图由 AI 生成,仅供参考
你好,我是大明,一个专注于中间件研发的开源爱好者。
我们都知道,Go 泛型已经日渐成熟,距离发布正式版本已经不远了。目前已经有很多的开发者开始探索泛型会对 Go 编程带来什么影响。比如说,目前我们比较肯定的是泛型能够解决这一类的痛点:
数学计算:写出通用的方法来操作 int 、 float 类型;
集合类型:例如用泛型来写堆、栈、队列等。虽然大部分类似的需求可以通过 slice 和 channel 来解决,但是始终有一些情况难以避免要设计特殊的集合类型,如有序 Set 和优先级队列;
slice 和 map 的辅助方法:典型的如 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
《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-124 - 洛书最不可接受的是使用[]作为泛型类型声明, [] 本身已经作为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
收起评论