GO1.8 之前 只支持 内置泛型,GO1.8 开始 也支持 自定义泛型。
//复杂的组合类型 matrix:=[3][4]int{ {1,0,0,1}, {0,1,0,1}, {0,0,1,0}, } matrix[1][1]=3 a:=matrix[1] //变量 a 的类型为[4]int fmt.Println(a) // [0 3 0 1]
- **bool 是一个基类型为 另一个 指针类型*bool 的指针类型
- chan chan int 是一个元素类型 为另一个普通通道类型chan int 的通道类型
- map[int]map[int]string 是一个元素类型 为 另一个映射类型map[int]string的映射类型,键值类型都是 int
- func(int32)func(int32) 是一个输入参数和一个返回参数,键值类型都是 int
- //自定义类型
- chan *[16]byte //指针类型,数组类型,内置类型为 byte
//通道的类型例子 cy:=make(chan *[16]byte) //go func() {}()// 三个括号 go func() { //使用两个数组,避免数据竞争 var dataA1,dataB1 = new([16]byte),new([16]byte) //通过 new 创建指针 for{ _,err:=rand.Read(dataA1[:]) if err!=nil{ close(cy) //遍历之前需要 关闭 通道 }else { cy <- dataA1 //数据推入 通道 dataA1,dataB1=dataB1,dataA1 } } }() //这个 小口号 注意别丢了 for data:=range cy{ fmt.Println((*data)[:]) time.Sleep(time.Second/2) }
//复杂的类型 []map[struct{ a intb struct{ x stringy bool } }]interface{ Build([]byte,struct{x string;y bool}) error Update(dt float64)Destroy() } // 拆解 type B= struct { x string y bool } type K= struct { a int b B } type E= interface { Build([]byte,B)error Update(dt float64)Destroy() } type T=[]map[K]E // 合在一起
自定义泛型
type My interface { int | float64 | int64 | int16 | string | bool } //泛型的引用 func GetMy[T My](a,b T) T{ //[T My] 自定义类型 , (a,b T) 数据是自定义的类型,返回也是 T 自定义类型 } //泛型的调用 var aa int =10 var bb int =20 GetMy(a,b) //编译器自动 推断传入的类型是 int GetMy[int](a,b) //显式,告诉 传入的是 int
泛型到底是干嘛的 旨在为程序员生成代码,减少重复代码的编写
golang 无敌内置泛型
type any=interface{} //any 表示 go 中 所有内置基本类型 type comparable interface{comparable} //comparable: 表示 go 里面所有内置的可比较类型:int、uint、float、bool、struct、指针
泛型 与 结构体 结合
type getA interface{ int8|int16 } type getB interface{ string } type User[T getA,E getB] struct{ //通过 struct 包裹 geta T getb E } //方法函数 获取 getafunc(u *User[T,E])Geta()T{ //注意返回类型 T,结构体*User[T,E]的函数 return u.geta } //方法函数 获取 getbfunc(u *User[T,E])Getb()E{ //注意返回类型 E, 结构体*User[T,E]的函数 return u.getb } //调用和使用 var uu User[int8,string] //显式给出 定义和使用 uu.geta=18 uu.getb="hello" geta:=uu.Geta() getb:=uu.Getb() fmt.println(geta,getb)