前言
在很多情况下,接口类型没有办法直接作为值来使用,或者说我们需要检查某个接口变量是否为我们期望的类型,就需要先使用类型断言 (type assertion)
进行类型判断以及转换。
基本用法
断言语句
一个类型断言语句检查它操作对象的动态类型是否和断言的类型匹配。
value, ok := x.(T)
各变量含义为:
x
:要判断的变量,必须为接口类型
T
:被判断的目标类型
value
:成功转换后的值,动态类型
ok
:是否为目标类型,bool 类型
需要注意的是,如果 x == nil
,那么断言一定失败。
如果在已经确定 x
就是 T
类型的前提下,也可以省略 ok
,但是只要类型不匹配,就会报 panic
value := x.(T)
断言类型种类
类型断言语句中,T
可以是具体类型也可以是接口类型。
具体类型
如果 T
是一个具体类型,那么类型断言会检查 x
的动态类型是否和 T
相同,如果相同,ok = true
,value
为转换后的值,如果不相同,ok = false 且 value = nil
,但是需要注意 x
必须为接口类型,否则编译会失败,使用示例如下:
// 错误用法
// combile error: invalid type assertion: num.(int) (non-interface type int on left)
num := 10
if v, ok := num.(int); ok {
fmt.Println(v)
}
// 正确用法