玩转Go语言之断言推导

1,389 阅读2分钟

1.断言怎么来的:

//1.空接口可以接受任何类型的数据
//var num int = 5
//var in interface{}
//in = num
//fmt.Printf("%T,%v",in,in)

//定一个空接口保存一个整型数据
var in interface{} = "张三"

//定义一个字符串变量
var value string

//把空接口赋值给字符串变量会报错
//原因:go语言中只有相同的数据类型才能赋值,我们可以使用go语言中的断言解决这个问题
//value = in

//把空接口转换成具体的数据类型
value = in.(string)
fmt.Printf("%T,%v",value,value)

if value ,ok := in.(string); ok{
   fmt.Printf("%T,%v",value,value)
}else {
   //打印字符串变量
   fmt.Println("转换失败")
}

2.如何使用断言:

//定义一个结构体类型
type Person struct {
   name string
   age int
}

//定义一个接口
type Usb interface {
   start()
}

//利用结构体实现接口中的所有方法
func (p Person)start()  {
   fmt.Println(p.age,p.name)
}

func (p Person)end()  {
   fmt.Println(p.age,p.name)
}

func main() {

   //1.把接口类型转换成具体类型

   //定义一个接口变量
   var in Usb = Person{"张三",20}

   //调用接口中的方法
   in.start()

   //接口转换成结构体数据类型
   if cm, ok := in.(Person); ok{
      cm.end()
      fmt.Println(cm.name)
   }

   //2.可以把空接口类型转换成具体接口类型
   var inEmpty interface{} = Person{"张三",20}
   if cm, ok := inEmpty.(Usb); ok{
      cm.start()
   }
   
}

总结:

1.如果结构体实现了某个接口, 那么就可以使用接口类型来保存结构体变量
2.如果利用接口类型变量保存了实现了接口的结构体, 那么该变量只能访问接口中的方法, 不能访问结构体中的特有方法, 以及结构体中的属性
3.如果利用接口类型变量保存了实现了接口的结构体,想要访问结构体中特有的方法和属性, 那么必须进行类型转换, 将接口类型转换为结构体类型

 代码:https://github.com/codeXiaoQiang/Go-language