一、介绍
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
例子:
package main import "fmt"func main(){var x interface{}var b2 float64 = 1.1x = 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.1x = 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]UsbusbArr[0] = Phone{"vivo"}usbArr[1] = Phone{"小米"}usbArr[2] = Camera{"尼康"}//遍历 usbArr //Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量, //除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言var computer Computerfor _, 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\n",index,x)case int:fmt.Printf("第%v个参数是int类型,值是%v\n",index,x)case string:fmt.Printf("第%v个参数是string类型,值是%v\n",index,x)default:fmt.Printf("第%v个参数类型不是上面的,值是%v\n",index,x)}}}func main(){var n1 int = 1var n2 string = "dd"var n3 bool = falseGetType(n1,n2,n3)}###结果### 第0个参数是int类型,值是1 第1个参数是string类型,值是dd 第2个参数是bool类型,值是false