Golang 泛型
泛型函数
定义
func Func1[T int | int32 | int64 | float32 | float64](a, b T) T {
return a + b
}
使用
Func1[int32](1, 2)
但是这样好像看起来很丑,所以可以使用自动类型推导,也就是让 Golang 自己去判断泛型参数(方括号中的类型)究竟是什么,所以调用方式就可以像下面这样
Func1(1, 2)
泛型 map
定义
type Map1[K int | float32, V string] map[K]V
⚠️:K,V 并不是一定要同时定义,比如上例就可以直接定义成
type Map1[K int | float32] map[K]string
⚠️:K,V 没有顺序关系,只是泛型的约束,只是一个代称(叫其他名字也OK)。也就是说 K 不一定非得做“键”,V 不一定非得做“值”,也就是说,上例写成下面这样也没有问题,只是约束对象发生了交换。
type Map1[K int | float32, V string] map[V]K
等价于
type MapInt map[int]string
type MapFloat32 map[float32]string
实例化
var m Map1[int, string] = make(Map1[int, string])
泛型 slice
定义
type Slice1[T int | int32] []T
等价于
type SliceInt []int
type SliceInt32 []int32
实例化
// 等价于 var arr SliceInt 或 var arr []int
var arr Slice1[int]
泛型 struct
定义
type Struct1[T float32 | float64] struct {
X T
Y T
}
等价于
type StructFloat32 struct {
X float32
Y float32
}
type StructFloat64 struct {
X float64
Y float64
}
使用
var p Struct1[float32]
⚠️
- 虽然在上述提到的个例当中,除了泛型的 map 其他都只使用了一个泛型参数,但实际上 struct 和泛型函数都可以使用多个泛型参数,与 泛型 map 使用方式相同
- 泛型变量被声明之后其使用方法与直接将其定义为指定数据类型是相同的——你可以认为泛型是一个盒子,盒子里面可能装着 int32 和 int64 两种数据类型中任何一种。在你声明某个泛型变量之前永远不知道盒子中的具体数据类型,此时盒子处于两种数据类型的叠加状态,既此时盒子里面的数据类型既是 int32 又是 int64(我不是说 int 在不同平台上的表现)。但是你一旦声明了某个泛型的变量,盒子中的数据类型就由原本的类型叠加态坍缩为单一的某个数据类型,既盒子中只可能是 int32 或 int64
- 匿名结构体不支持使用泛型
- 泛型类型可以相互嵌套,你可以在一个泛型 struct 中使用一个泛型 slice,但是需要显式声明泛型 slice 的数据类型(也就是说这么搞意义不大,不如直接定义两个泛型参数)。
泛型约束
泛型约束指的的约束泛型泛型能接受的数据类型,更直白的说就是这个 T 可以指代的数据类型。关于泛型约束我们上面提及了一部分,那就是如何使用——在定义的时候在方括号内指定。但是我们先看下面的一个
标签:int16,数据类型,Golang,interface,使用,泛型,type,int8 From: https://www.cnblogs.com/ltozvxe/p/16777942.html