Golang-类型断言
基本介绍
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言, 具体的如下:

对上面代码的说明:
在进行类型断言时,如果类型不匹配,就会报 panic, 因此进行类型断言时,要确保原来的空接口指向的就是断言的类型.
如何在进行断言时,带上检测机制,如果成功就 ok,否则也不要报 panic

类型断言的最佳实践
在前面的 Usb 接口案例做改进:
给 Phone 结构体增加一个特有的方法 call(), 当 Usb 接口接收的是Phone 变量时,还需要调用 call方法
package main import ( "fmt" ) //声明/定义一个接口 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{"phone"} usbArr[2] = Camera{"华为"} //遍历 usbArr //Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量, //除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言 var computer Computer for _, v := range usbArr { computer.Working(v) fmt.Println() } }
类型断言
func main() { var a interface{} var points Points = Points{1,2} a = points var b Points b = a.(Points) //******* _, err := a.(Points) //带检测机制 成功返回true 失败返回false fmt.Println(b) }