推荐博客
The Go Programming Language Specification
总结
-
为什么要用泛型?不用为不同类型重复写一套相同逻辑代码。
-
概念:
-
类型形参、类型约束、类型形参列表
这些用来定义「泛型类型」。
所有类型定义(如:函数、接口等)都可以使用类型形参。
类型形参不能使用类型断言和type switch
-
泛型类型、泛型类型实例化、类型实参
使用泛型类型时需要传递类型实参,这就是「泛型类型实例化」
-
泛型接收器
-
泛型函数
目前Go的方法并不支持泛型
-
-
接口相关概念的变更:
-
接口定义的变更:从「方法集」到「类型集」
Go 1.18之前:An interface type specifies a method set called its interface
Go 1.18之后:An interface type defines a type set。
特殊的类型集——
空接口 interface{}
。因为Go1.18开始接口的定义发生了改变,所以interface{}
的定义也发生了一些变更:「空接口代表了所有类型的集合」。 -
接口实现定义的变更:
当满足以下条件时,我们可以说 类型 T 实现了接口 I ( type T implements interface I) :
- T 不是接口时:类型 T 是接口 I 代表的类型集中的一个成员 (T is an element of the type set of I)
- T 是接口时: T 接口代表的类型集是 I 代表的类型集的子集(Type set of T is a subset of the type set of I)
-
接口分为两种类型:
也有叫「运行时接口」和「编译时接口」的,如:Go 1.18 新特性
-
基本接口:接口定义中只有方法,即方法集,和Go 1.18之前的接口一样。
-
一般接口:接口内不光只有方法,还有类型。
「一般接口类型」不能用来定义变量, 只能用于泛型的类型约束中 。
-
-
-
comparable(可比较) 和 可排序(ordered)接口
comparable接口,代表了所有可进行「!=」和「==」比较的类型。
ordered接口,代表了所有可进行大小比较的类型。