泛型
简单尝试泛型函数
1
2
3
4
5
6
7
|
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
|
comparable
允许其值可用作比较运算符的任何类型,这里作为 map 的 key 是必要的。
参数 V
是两种类型的联合,使用 |
指定,意味着此约束允许任何一种类型。
调用方法。指定类型参数,以便清楚地了解在调用的函数中替换类型参数的类型。通常可以省略,如果 Go 编译器可以从代码中推断出它们。(调用没有参数的泛型函数,无法推断)
1
2
3
4
|
fmt.Printf("Generic Sums: %v and %v\n",
SumIntsOrFloats[string, int64](ints),
SumIntsOrFloats[string, float64](floats),
)
|
声明类型约束
当您希望将类型参数约束为 int64或 float64时,可以使用这个 Number 类型约束,而不是写出 int64 | float64。
1
2
3
|
type Number interface {
int64 | float64
}
|
1
2
3
4
5
6
7
|
func SumNumbers[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
|
参考
Go 官方泛型教程
泛型设计