func sumGeneric[T int | float64](numbers []T) T {
var total T
for _, num := range numbers {
total += num
}
return total
}
泛型为Go语言引入了三个重要的新特性:
- 支持在函数和类型定义中使用类型参数,使其更加通用。
- 扩展了接口的概念,使其可以表示一组类型的集合,不再局限于方法集。
- 引入智能类型推导机制,在很多场景下可以省略显式的类型参数。
类型也可以使用泛型#
要使用泛型类型,必须进行实例化。
type List[T any] []T
type Pair[K comparable, V any] struct {
Key K
Value V
}
type Node[T any] struct {
next *Node[T]
value T
}
type Vector []int32
func MultiplyEach[E constraints.Integer](s []E, factor E) []E
MultiplyEach(Vector{1,2,3}, 3)
->MultiplyEach([]int32, int32) []int32
func MultiplyEach[S ~[]E, E constraints.Integer](s S, factor E) S
MultiplyEach(Vector{1,2,3}, 3)
->MultiplyEach(Vector, int32) Vector
S ~[]E 的意思是:
函数接受所有底层类型是 []E 的切片, 并且返回同样的类型 S, 这样就不会丢失自定义类型(如 Vector)。
Reply by Email