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