一、介绍
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
例子:
package main import "fmt" func main(){ var x interface{} var b2 float64 = 1.1 x = b2 //空接口,可以接收任意值 //类型断言 y := x.(float64) // y2 := x.(float32) //不匹配会报错 fmt.Printf("type:%T 值:%v",y,y) // fmt.Printf("type:%T 值:%v",y2,y2) } ##结果#### type:float64 值:1.1
断言时带上检测机制,如果失败不报错
例子:
package main import "fmt" func main(){ var x interface{} var b2 float64 = 1.1 x = b2 //空接口,可以接收任意值 //类型断言 if y,ok := x.(float32); ok { fmt.Printf("type:%T 值:%v",y,y) }else{ fmt.Println("error!") } fmt.Println("end") } ###结果#### error! end
二、类型断言最佳实践
例子 一:
package main import "fmt" //定义一个usb接口 type Usb interface { //声明了两个没有实现的方法 Start() Stop() } type Phone struct { name string } //让 Phone 实现 Usb 接口的方法 func (p Phone) Start() { fmt.Println("手机开始工作。。。") } func (p Phone) Stop() { fmt.Println("手机停止工作。。。") } func (p Phone) Call() { fmt.Println("手机 在打电话..") } type Camera struct { name string } //让 Camera 实现 Usb 接口的方法 func (c Camera) Start() { fmt.Println("相机开始工作。。。") } func (c Camera) Stop() { fmt.Println("相机停止工作。。。") } type Computer struct { } func (computer Computer) Working(usb Usb) { usb.Start() //如果 usb 是指向 Phone 结构体变量,则还需要调用 Call 方法 //类型断言 if phone, ok := usb.(Phone); ok { phone.Call() } usb.Stop() } func main() { //定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量 //这里就体现出多态数组 var usbArr [3]Usb usbArr[0] = Phone{"vivo"} usbArr[1] = Phone{"小米"} usbArr[2] = Camera{"尼康"} //遍历 usbArr //Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量, //除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言 var computer Computer for _, v := range usbArr{ computer.Working(v) fmt.Println() } } ####结果#### 手机开始工作。。。 手机 在打电话.. 手机停止工作。。。 手机开始工作。。。 手机 在打电话.. 手机停止工作。。。 相机开始工作。。。 相机停止工作。。。
例子 二:
package main import "fmt" //编写一个函数,判断输入参数的类型 func GetType(items... interface{}) { for index,x := range items { switch x.(type) { case bool: fmt.Printf("第%v个参数是bool类型,值是%v ",index,x) case int: fmt.Printf("第%v个参数是int类型,值是%v ",index,x) case string: fmt.Printf("第%v个参数是string类型,值是%v ",index,x) default: fmt.Printf("第%v个参数类型不是上面的,值是%v ",index,x) } } } func main(){ var n1 int = 1 var n2 string = "dd" var n3 bool = false GetType(n1,n2,n3) } ###结果### 第0个参数是int类型,值是1 第1个参数是string类型,值是dd 第2个参数是bool类型,值是false