funcmain() { var a interface{} var b interface{} a = 1 b = "1" fmt.Println(a == b) a = 1 b = 1 fmt.Println(a == b) } >> false true
比较空接口时,先比较底层类型,如果类型不匹配的话则为 false,然后再比较值
如果底层类型不能比较会 panic,comparable 代表所有可比较类型
1
type comparable interface{ comparable }
值接收实现接口
值接收者实现接口之后,不管是 dog 结构体还是结构体指针 *dog类 型的变量都可以赋值给该接口变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
type Mover interface { move() } type dog struct{}
func(d dog) move() { fmt.Println("run") } funcmain() { var x Mover var a = dog{} // a 是 dog 类型 x = a // x 可以接收 dog 类型 var b = &dog{} // b 是 *dog 类型 x = b // x 可以接收 *dog 类型 x.move() } >> run
指针接收实现接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
type Mover interface { move() } type dog struct{}
func(d *dog) move() { fmt.Println("run") } funcmain() { var x Mover //var a = dog{} // a 是 dog 类型 //x = a // x 可以接收 dog 类型 var b = &dog{} // b 是 *dog 类型 x = b // x 可以接收 *dog 类型 x.move() } >> run
Mover 接口的是 *dog 类型,所以不能给 x 传入 dog 类型的 a,此时 x 只能存储 *dog 类型的值。
泛型
1 2 3 4 5 6 7
funcSum[Tint | float64](a, b T) T { return a + b }
// T 是类型形参,取决于传进来的类型 // int | float64 构成了类型约束,规定了允许的类型 // Sum[int]() 指定 int 类型
显式指明用哪种类型
1
Sum[int](2012, 2022)
不指定类型
1
Sum(1.23,1.14514)
泛型切片,类型约束 int | int32 | int64
1
type GenercSlice[T int | int32 | int64] []T
不能省略类型实参
1
GenercSlice[int]{1,2,3}
泛型哈希表,键的类型必须可比较,使用 comparable 接口,值的类型约束为 V int | string | byte
1
type GenericMap[K comparable,V int | string | byte] map[K]V
使用如下
1 2 3 4 5 6 7 8 9 10 11 12
type GenericMap[K comparable, V int | string | byte] map[K]V
funcmain() { var gmap1 = GenericMap[int, string]{1: "sad"} var gmap2 = make(GenericMap[string, byte], 0)
type GenericStruct[T int | string] struct { Name string Id T }
SayAble 是一个泛型接口,Person 实现了该接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
type SayAble[T int | string] interface { Say() T } type Person[T int | string] struct { msg T } func(p Person[T]) Say() T { return p.msg } funcmain() { var s SayAble[string] s = Person[string]{"sad"} fmt.Println(s.Say()) } >> sad
forrange5 { buffer := bufferPool.Get() buffer.WriteString("sad") fmt.Println(buffer.String()) buffer.Reset() bufferPool.Put(buffer) } } >> sad sad sad sad sad