25.泛型

泛型

简单尝试泛型函数

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 官方泛型教程

泛型设计

Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy