Go 1.18 如何实现泛型?

Go 在 1.18 版本中初步支持了泛型(也称作类型参数)。泛型是 Go 1 发布以来 Go 语言最重要的变化…

Go 在 1.18 版本中初步支持了泛型(也称作类型参数)。泛型是 Go 1 发布以来 Go 语言最重要的变化,同时也是有史以来最大的单一语言特性变化。

近日开发团队介绍了他们如何通过字典 (dictionaries) 和 GC Shape Stenciling 在 Go 1.18 中实现泛型。

泛型的编译器实现(在类型检查之后)主要侧重于创建泛型函数和方法的实例,这些实例将与具有具体类型的参数一起执行。为了避免针对泛型函数/方法的每一次调用创建不同的函数实例,并带有不同类型的参数(这种是纯粹的 stenciling 方案)。因此 Go 泛型在每次调用泛型函数/方法时都会传递一个字典。该字典提供了关于类型参数的相关信息,允许单个函数实例对许多不同的类型参数正确运行。

但是,为了泛型的简洁(和性能),团队没有针对所有可能的类型参数进行单一的通用函数/方法编译。相反,他们在具有相同 gcshape 的类型参数集之间共享通用函数/方法的实例化。

gcshape (or gcshape grouping) 是类型的集合,当被指定为类型参数之一时,这些类型可以在泛型的实现中共享通用函数/方法的相同实例。

例如,在具有单一类型参数的泛型函数的场景中,只需要为同一 gcshape grouping 中的所有类型参数提供一个函数实例。同样的,对于具有单一类型参数的泛型类型的方法,只需要对同一 gcshape grouping 中的所有类型参数(泛型类型)进行一次实例化。gcshape 类型是团队实现泛型过程中使用的特定类型,他们使用这样的实例化来填充 gcshape grouping 中的所有类型。

关于作者: qwephp

.

为您推荐