最近一篇关于“Go泛型导致代码运行变慢”的文章引起了很多讨论。因为Go的开发者对“泛型”这个特性期待了很久,但是最后发现还是有差距。Go泛型的主要设计者IanLanceTaylor也注意到了相关的讨论,所以他最近在Go官方博客上发表了2021年的演讲——《When To Use Generics》,介绍Go泛型的最佳使用时机。上述文章指出,C++、D,甚至Rust等系统语言在历史上都采用了泛型的单态方法。不过,Go1.18的泛型实现并没有完全依赖单态化(Monomorphization),而是使用了一种称为“GCShapestencilingwithDictionaries”的部分单态化技术。这种做法的好处是可以大大减少代码量,但在某些情况下,会导致代码速度变慢。根据IanLanceTaylor的说法,Go的通用开发指南要求开发人员应该通过编写代码而不是定义类型来编写Go程序。对于泛型,如果您通过定义类型参数约束来编写程序,那么您一开始就走错了路。正解应该从写函数开始。明确了类型参数的作用之后,添加类型参数就很容易了。接下来,Ian列举了4种可以有效使用类型参数的情况:使用语言定义的特殊容器类型;一般数据结构类型参数优于函数而不是方法;类型参数的情况:不要用类型参数来代替接口类型(InterfaceType)。如果方法实现不同,则不要使用类型参数。在适当的地方使用反射。最后,Ian给出了使用泛型的简要指南。当开发人员发现自己多次编写完全相同的代码,而这些副本之间的唯一区别是使用不同的类型时,请考虑使用类型参数。换句话说,开发人员应该避免使用类型参数,直到他们发现自己多次编写完全相同的代码。本文转自OSCHINA文章标题:Go泛型的主要设计者介绍泛型的最佳使用时机本文地址:https://www.oschina.net/news/191309/when-generics
