9.1 类型和泛型

类型本质上定义了

  • 所有可能的值(对于给定类型)的集合

  • 允许对这些值执行的操作

类型不是互斥的。也就是说,一个值可以属于多个类型。特别地,在 Go 中,一个值最多只能属于一个非接口类型(在编译和运行时),并且它可以同时属于零个、一个或多个接口类型。此外,一个值在编译时至少有一种类型(称为“静态类型”)。

Go 语言包括许多预先声明的类型:

any bool byte comparable
complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr

可以创建新类型,例如使用复合类型字面值:

array, struct, pointer, function, interface, slice, map, channel

类型可以是匿名的。或者,类型可以由显式类型名称后跟可选的类型参数表示。

Go 还支持参数化类型(自 Go 1.18 起)。命名类型声明可以用类型参数参数化,这本质上声明了一组可能的类型。带有类型参数的命名类型被称为泛型类型。

例如,此示例声明了具有类型参数 E 的泛型 struct 类型 Node,可用于创建(泛型)链接列表数据结构。

type Node[E any] struct {
    Item E
    Next *Node[E]
}

在这个例子中,E 被限制为任意类型。任意是 interface {} 的预声明类型别名。Go 中的所有值都是 any 类型。因此,任何类型都可以用于定义 Node 的具体类型。例如,Node[int] 是有效类型,Node[string] 也是有效类型,以此类推。

最后更新于