Go 1.18 如何实现泛型?


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 中的所有类型。


相關推薦

2022-09-13

Go 代码中使用泛型。不过开发者也已经遇到了初始泛型实现的一些限制。 Fuzzing(模糊测试)对大多数 Go 开发者来说是新事物。受访者对 Go 内置模糊测试的认知远低于泛型,并且他们对于为什么或何时考虑使用模糊测试有更

2022-11-12

布的新功能: Go 1.18 为语言本身带来了一项重大功能:泛型,其次还有 Go 工作区、模糊测试等重要功能。 泛型是社区呼声最大的特性,也是今年 Go 最重大的特性,它为 Go 添加了参数多态性,以允许编写适用于各种不同类型

2022-03-27

范式独立于所使用的特定类型,泛型允许在函数和类型的实现中使用某个类型集合中的任何一种类型。 泛型为 Go 添加了三个新的重要内容: 面向函数和类型的“类型形参” (type parameters) 将接口类型定义为类型集合,包括没有

2022-08-03

得该版本。"它的大部分变化是在工具链、运行时和库的实现方面。一如既往,该版本保持了 Go 1 的兼容性承诺。我们期望几乎所有的 Go 程序都能像以前一样继续编译和运行"。该版本包括一些内存模型的调整,LoongArch port,文档

2023-04-28

- name: nginx image: "nginx:1.14.2" ports: - containerPort: 80 Go 代码如何集成 KCL 以上一节的 hello.k 为例,构建以下的 main.go 代码: package main import ( "fmt" "kusionstack.io/kclvm-go" ) func main() { result := kclvm.MustRun("./hello.k").GetRawYamlResult() fmt.Printl

2023-05-18

查。共 5,844 名开发者参与了本次调查,分享了他们有关如何使用 Go、在使用 Go 时遇到的最大挑战、以及他们首要考虑的改进方向等方面的内容。 今年的调查引入了一个基于自我认定的经验水平的新细分。基于受访者对"你的 Go

2022-12-02

现在默认开启,让您可以立即查看应用 IDE 建议后代码将如何变化。 在意图操作列表打开时,您可以按 F1 启用或禁用预览功能。 将工具窗口停靠到浮动编辑器选项卡 为了让您可以更轻松地安排工作空间并在多个显示器上与

2022-10-17

十月中旬,我们推出了 Gitea 1.17.3 版本。与此同时,1.18版本的新特性也几乎确定,追踪 Gitea 的代码仓库可以发现最新的 feature 大部分已进入冻结状态,相信不久之后会放出预览版,心急的小伙伴已经使用 Docker 快速切换到 Dev 分

2022-07-31

ation(快速文档),GoLand 将显示工具提示,简要说明泛型如何工作并提供 Go 团队教程的链接。 类型断言的工具提示现在包含额外相关信息并提供了示例。 如果将鼠标悬停在大括号内的区域上,在你初始化映射、数组、切片

2022-02-25

下图是运行过程中 CPU 和响应时间的峰值,左边为 Go 实现的版本,右边为 Rust 实现的版本。 Go 开发团队 leader Russ Cox (rsc) 认为 AWS 在这里的比较对 Go 存在严重的误导。他认为,AWS 的文章将两者进行对比时,将 Go 版本的

2022-11-08

上的较小片段。 Redis 支持 对 Redis 支持的初步迭代已经实现。 Windows ARM64 已经开始分发 Windows ARM64 的安装程序,可以从官方网站或 Toolbox App 下载。 更多详情可查看:https://blog.jetbrains.com/go/2022/11/04/goland-2022-3-reaches-beta/

2022-07-06

size_t,改用 usize。 添加 datatypes 和 datatypes.fsm 模块。 泛型接口 修复泛型中的更多错误 更多详情可查看:https://github.com/vlang/v  

2023-01-24

LiteIDE X38.1 发布,支持 Go1.18 泛型。 * 支持 Go1.18 泛型,支持泛型/实例的代码完成,查找和重构支持。 * 改进环境变量,编辑器,代码完成和集成终端等插件。 * 支持 VS2019 和 FreeBSD/OpenBSD 编译。   ### 2023.01.22 Ver X38.1 * LiteIDE

2023-02-03

们需要订阅7s前的数据时,可以在订阅参数后面加上?mode=2实现从7秒前开始订阅。 启用该功能将会大大增加内存消耗,仅在特殊场合使用 订阅模式参数 订阅模式分为0、实时模式,会自动追赶。1、不追赶,防