文 | 局长
出品 | OSC开源社区(ID:oschina2013)
OSC开源社区
,赞 67
-
面向函数和类型的“类型形参” (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)
向 GMin 提供类型参数,在这种情况下 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)
推荐阅读
谷歌Fuchsia OS负责人离职,网友:被鸿蒙挖走了?
苹果有开源(上):乔布斯的复仇衍生品Darwin
觉得不错,请点个在看呀
文章评论