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)