泛型
- Go的泛型(或者或类型形参)目前可使用在3个地方
- 泛型类型 - 类型定义中带类型形参的类型
- 泛型receiver - 泛型类型的receiver
- 泛型函数 - 带类型形参的函数
- 为了实现泛型,Go引入了一些新的概念:
- 类型形参
- 类型形参列表
- 类型实参
- 类型约束
- 实例化 - 泛型类型不能直接使用,要使用的话必须传入类型实参进行实例化
- 以下三个典型位置无法自定义泛型(但是可以使用别处定义好的泛型)
- 匿名结构体
- 匿名函数
- 方法
- Go1.18开始就是依据泛型的引入将接口的定义正式更改为了 类型集(Type set)
- 接口可以不止书写一行,如果一个接口有多行类型定义,那么取它们之间的 交集
- 虽然空接口内没有写入任何的类型,但它代表的是所有类型的集合,而非一个 空集
- 类型约束中指定 空接口 的意思是指定了一个包含所有类型的类型集,并不是类型约束限定了只能使用 空接口 来做类型形参
- any 就是 interaface{} 的别名(alias),两者 完全等价
- Go内置了一个叫 comparable 的接口,它代表了 所有可用 != 以及 == 对比的类型
- Go1.18开始将接口分为了两种类型
- 基本接口(Basic interface)
- 接口定义中如果只有方法
- 定义接口变量并赋值
- 也代表了一个类型集,所以也可用在类型约束中
- 一般接口(General interface)
- 接口内不光只有方法,还有类型
- 一般接口类型不能用来定义变量,只能用于泛型的类型约束
- 接口定义中使用类型形参则为是泛型类型,使用 泛型类型也必须传入类型实参实例化 。
- 接口定义的种种限制规则
- 用 | 连接多个类型的时候,类型之间不能有相交的部分(即必须是不交集)
- 但是相交的类型中是接口的话,则不受这一限制
- 类型的并集中不能有类型形参
- 接口不能直接或间接地并入自己
- 接口的并集成员个数 大于一 的时候不能直接或间接 并入 comparable 接口
- 带方法的接口 (无论是基本接口还是一般接口),都 不能写入 接口的并集中
- 用 | 连接多个类型的时候,类型之间不能有相交的部分(即必须是不交集)
- 基本接口(Basic interface)