本文是关于范型的一些比较浅层的,常用的应用总结
本文涉及到interface的类型约束,范型与类型约束几乎是密不可分,可以参考
然后是版本问题,go1.18及之后才能正常使用范型编程
总的来讲范型的使用就是类型约束 + 类型参数的使用
范型结构体、范型类型、范型函数
范型结构体
type Object[T int | float64] struct {
Money T
}
范型类型
这里只距离一个map类型,切片、管道之类的,就不写了
type MyMap[Key int | float64, Value interface{}] map[Key]Value
范型函数
可以看到中括号中,就是类型参数
type MyNumber interface {
int | float64
}
func Sum[MyNum MyNumber](a, b MyNum) T {
return a + b
}
其实这些都可以称为约束
自定义类型的约束
type TestS struct {
age int
}
func (t TestS) TestS1() {
fmt.Println(1111111)
}
func (t TestS) speak() {
fmt.Println(22222)
}
type TestI interface {
speak()
TestS
}
func TestIFunc[TestIType TestI](t TestIType) {
fmt.Println(33333333)
}
这里就是只允许TestS实现TestI
接口约束
type TestA interface {
TestS2()
}
type TestI interface {
speak()
TestA
}
没什么好说的,实现TestI必须要实现TestA
这里需要注意,在使用interface约束类型的时候,无法对带有方法的接口做联合约束,也就是
type TestI interface {
speak()
TestA | int
}
不可以这样写,编译不过去