Golang
Golang接口断言
11-28 09:34空接口可以接收任何类型,如果希望把空接口类型重新再转换成对应的类型,就需要使用类型断言
类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言
初识断言
工作汇总经常遇到这种情形:
1、有一个空接口变量,接收一个float64类型的变量,那么这个空接口变量就变成float64型
2、此时再把这个空接口变量赋值给另一个float64类型的变量,就会报错,如下图

解决这种问题,就需要用到类型断言,如下:

通过上面的案例可看出
1、断言就是判断空接口变量是否为某个数据类型
2、断言的格式:接口变量.(数据类型)
断言类型检测
在进行类型断言时,如果类型不匹配,会报panic

因此进行类型断言时,要确保原来的空接口指向的就是断言类型
但如果数据较多,或者并不知道原来的数据类型是什么,这时需要在断言时,带上检测机制

检测机制还可以有以下写法(看似更整洁),但要注意断言后变量的作用域仅限于 if 语句内

牢记两种写法的区别:在 if 语句外面断言,得到的变量作用域更广泛,而 if 语句中的断言,得到的变量,仅限于在 if 语句内部使用
类型断言的实践案例
1、Usb 接口案例,按以下步骤依次实现
⑴. 定义一个 Usb 接口,分别有 start() 和 stop() 方法
⑵. 有 Phone 和 Camera 两个结构体实现了 Usb 接口,但 Phone 结构体还有一个特有的方法 Call()
⑶. 通过 Usb 接口依次调用 start() 方法和 stop() 方法,判断当接口接收的是 Phone 变量时,还需调用 Call() 方法

2、写一个函数,循环判断传入参数的类型,包括自定义类型(结构体、结构体指针)

注意以上案例已说明,结构体和结构体指针等自定义类型,都可以用接口类型来判断,前提是已经实现了这个接口
map接口断言
当接口接收一个map时,将map中的参数再赋值给其它变量,就需要断言

使用断言后,可以正常运行

当确定字段类型时,也可省去if语句,前提是一定能够确参数的类型,否则会报出panic

若在map接口接收了map,变成了二维map,使用时就需要对map接口中的map进行断言,而第二层map中的字段,若果赋值时已经明确类型,不用再次断言

将map中字段的值赋给其它变量,同样无需再次断言(前提必须明确声明字段的类型)

再次强调:一定要在声明map时明确字段类型,最后使用时才不用再次断言,若map接口中嵌套了map接口,就需要全部进行断言了