Go 泛型主要设计者介绍使用泛型的最佳时机

来源: OSCHINA
编辑:
2022-04-15 08:31:00

近期一篇主题为 Go 泛型导致代码运行速度变慢的文章引起了广泛讨论。因为 Go 开发者对“泛型”这项特性期盼已久,但最后却发现有所落差。

Go 泛型主要设计者 Ian Lance Taylor 也留意到了相关的讨论,于是近日他在 Go 官方博客发表了自己 2021 年的演讲——《When To Use Generics》,来介绍使用 Go 泛型的最佳时机。

上文提到的文章指出,从历史上看,C++、D 乃至 Rust 等系统语言一直采用单态化方法实现泛型。然而,Go 1.18 的泛型实现并不完全依靠单态化 (Monomorphization),而是采用了一种被称为"GCShape stenciling with Dictionaries"的部分单态化技术。这种方法的好处是可以大幅减少代码量,但在特定情况下,会导致代码速度变慢。

Ian Lance Taylor 表示,Go 的通用开发准则有要求:开发者应通过编写代码而不是定义类型来编写 Go 程序。当涉及到泛型时,如果通过定义类型参数约束来编写程序,那一开始就走错了路。正解应该是从编写函数开始,当明确了类型参数的作用后,再添加类型参数就很容易了。

接着,Ian 列举了 4 种类型参数能有效发挥作用的情况:

  1. 使用语言定义的特殊容器类型
  2. 通用数据结构
  3. 类型参数首选是函数,而非方法的情况
  4. 不同类型需要实现通用方法

同时也提醒了不适合使用类型参数的情况:

  1. 不要使用类型参数替换接口类型 (Interface Type)
  2. 如果方法实现不同,不要使用类型参数
  3. 在适当的地方使用反射 (reflection)

最后,Ian 给出了简要的泛型使用方针,当开发者发现自己多次编写完全相同的代码,而这些副本之间的唯一区别仅在于使用了不同类型,这时候便可以考虑使用类型参数。换句话说,即开发者应避免使用类型参数,直到发现自己要多次编写完全相同的代码。

延伸阅读:Go 语言之父介绍泛型

展开阅读全文
点击加入讨论🔥(17) 发布并加入讨论🔥
本篇精彩评论
基本上来説,就是尽量不用
2022-04-15 09:00
11
举报
就给那个微信一样,嘴上说便捷的交流工具,最后做的很大不说,每出一个功能就跟挤牙膏,主要功能还是鸡肋式的,说是go很简单,真正的用起来发现其实也没那么好用,残次品
2022-04-15 11:35
5
举报
有其他语言泛型使用经验的 直接就能上手 非常好用
2022-04-15 13:48
3
举报
Go的传统艺能了,走不寻常的路,结果发现自己是门外汉。
2022-04-15 12:40
3
举报
你说不能用就不能用?
2022-04-15 11:51
2
举报
17 评论
17 收藏
分享
返回顶部
顶部