泛型支持
go >= 1.18
为什么需要泛型
编写一个函数用来比较两个数的大小,对于golang这种强类型的语言,要么针对不同的类型分别实现一遍,要么使用 interface{}
类型。
func CompareInt64(a, b int64) bool {
if a >= b {
return true
} else {
return false
}
}
func CompareFloat64(a, b float64) bool {
if a >= b {
return true
} else {
return false
}
}
func Compare(a, b interface{}) bool {
switch a.(type) {
case int64:
a1 := a.(int64)
b1 := b.(int64)
if a1 >= b1 {
return true
} else {
return false
}
case float64:
a1 := a.(float64)
b1 := b.(float64)
if a1 >= b1 {
return true
} else {
return false
}
default:
return false
}
}
显然 interface{}
类型会打破强类型的约束,使程序暴露更多的错误。
如果引入泛型就可以将 CompareInt64
和 CompareFloat64
整合成一个函数。
定义泛型函数
golang支持泛型函数和泛型类型。
// 泛型函数
func GenericFunc[T any](args T) {
}
[T any]
为类型约束,any
表示任意类型,(args T)
为参数。
如果只想支持特定的几个类型可以这样写。
func GenericFunc[T int64|float64](args T) {
}
如果类型太多了,可以这样表示
type Number interface{
int | int32 | int64 | float64 | float32
}
func GenericFunc[T Number](args T) {
}
有时候需要类型可以进行算数运算,但是any
中有些类型又是不支持的,因此需要用到编译器内置的约束 comparable
,该类型必须支持==
方法。
func GenericFunc[T comparable](args