2022-09-26 接口interface

Go接口interface

Go语言中interface是一种类型,一种抽象的类型。

实现接口的条件:一个结构体只有实现了某个接口的全部方法,才算是实现了某个接口。

指针接受者与值接受者实现接口的区别:

使用值接受者实现接口方法时:结构体的值变量或者指针都能保存到接口变量中。

使用指针接收者实现接口方法时:只能将结构体指针保存到接口变量中。

package main
import "fmt"
//定义一个抽象类型,只要实现了Say()方法的结构体都可以称为Sayer类型
type mover interface{
   move()
}
type person struct {
   name string
   age int32
}
//使用值接受者实现接口:类型的值和类型的指针变量都能保存到接口变量中
// func(p person)move(){
//    fmt.Printf(p.name,"在跑\n")
// }

//使用指针接收者实现接口:使用指针接受者实现了接口的方式时,无法将值变量赋值给接口类型变量
func(p *person)move(){
   fmt.Println(p.name,"在跑")
}
func main() {
   var m mover
   // p1 := person{
   //    name: "huige",
   //    age: 18,
   // }
   //m= p1  使用指针接受者实现了接口的方式时,无法将值变量赋值给接口类型变量
   p2 := &person{
      name: "jiange",
      age: 20,
   }
   m= p2
   m.move()
}

接口可以嵌套

type mover interface{
   move()
}
type sayer interface{
   say()
}
type animal interface{
   mover
   sayer
}

空接口

空接口是指没有方法的接口类型,因此任意类型都实现了空接口,因此空接口可以存储任意类型。

func main() {
   var x interface{}  //定义一个空接口变量
   x = "hello"
   x =false
   x = 10
   fmt.Println(x)
}

空接口主要使用在函数参数,和map值中。

//作为map类型的value
var m  = make(map[string]interface{},16)
m["hui"] = 10
m["jian"] = false
//作为函数参数
func test(x interface{}){
   fmt.Println(x)
}

类型断言

   var x interface{}
   x = "hello"
   x =false
   x = 10
   fmt.Println(x)

   ret ,ok:=x.(int)  //猜的不对时返回断言的类型的0值,ok返回false
   if ok==true {
      fmt.Println("guess true ret:=",ret)
   }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容