接口类型断言
- 直接赋值模式:
o := i.(TypeName)
(1)TypeName是具体类型名,此时如果接口i绑定的实例类型就是具体类型TypeName,则变量o的类型就是TypeName,变量o的值就是接口绑定的实例值的副本(当然实例可能是指针值,那就是指针值的副本)
(2)TypeName是接口类型名,如果接口i绑定的实例类型满足接口类型TypeName,则变量o的类型就是接口类型TypeName,o底层绑定的具体类型实例是i绑定的实例的副本(实例可能是指针值,那就是指针值的副本)
(3)如果上述两种情况都不满足,则程序抛出panic
- comma,ok表达式模式:
if o,ok := i.(TypeName); ok{
}
(1)TypeName是具体类型名,此时如果接口i绑定的实例类型就是具体类型TypeName,则ok为true,变量o的类型就是TypeName,变量o的值就是接口绑定的实例值的副本(当然实例可能是指针值,那就是指针值的副本)
(2)TypeName是接口类型名,如果接口i绑定的实例类型满足接口类型TypeName,则ok为true,变量o的类型就是接口类型TypeName,o底层绑定的具体类型实例是i绑定的实例的副本(当然实例可能是指针值,那就是指针值的副本)
(3)如果上述两个都不满足,则ok为false,变量o是TypeName类型的“零值”,此种条件分支下程序逻辑不应该再去引用o,因此此时的o没有意义。