加餐|聊聊最近大热的Go泛型
该思维导图由 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-0943 - Rayjun白老师太强了,能够把复杂的问题通过简单的方式讲述出来,太值得学习了
作者回复: 谬赞了😁
2022-02-182 - lesserrorTony 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