其他
Go语言之父介绍泛型
文 | 局长
出品 | OSC开源社区(ID:oschina2013)
面向函数和类型的“类型形参” (type parameters)
将接口类型定义为类型集合,包括没有方法的接口类型
类型推断:在大多数情况下,在调用泛型函数时可省略“类型实参” (type arguments)
Type Parameters
现在函数和类型都具有类型形参” (type parameters),类型形参列表看起来就是一个普通的参数列表,除了它使用的是方括号而不是小括号。
func Min(x, y float64) float64 {
if x < y {
return x
}
return y
}
T
的类型参数列表,并替换了float64
。import "golang.org/x/exp/constraints"
func GMin[T constraints.Ordered](x, y T) T {
if x < y {
return x
}
return y
}
x := GMin[int](2, 3)
int
称为实例化。实例化分两步进行。首先,编译器在泛型函数或泛型类型中用所有类型形参替换它们各自的类型实参。然后,编译器验证每个类型形参是否满足各自的约束。如果第二步失败,实例化就会失败并且程序无效。fmin := GMin[float64]
m := fmin(2.71, 3.14)
GMin[float64]
的实例化产生了一个与Min
函数等效的函数,可以在函数调用中使用它。类型形参也可以与类型一起使用。
type Tree[T interface{}] struct {
left, right *Tree[T]
value T
}
func (t *Tree[T]) Lookup(x T) *Tree[T] { ... }
var stringTree Tree[string]
Tree
存储了类型形参T
的值。泛型类型也可以有方法,比如本例中的Lookup
。为了使用泛型类型,它必须被实例化;Tree[string]
是使用类型实参string
来实例化Tree
的示例。类型推断
此项功能是最复杂的变更,主要包括:
函数参数类型推断 (Function argument type inference)
约束类型推断 (Constraint type inference)
推荐阅读