Golang之路---03 面向对象——类型断言
类型断言
作用
- 检查 i 是否为 nil
- 检查 i 存储的值是否为某个类型
使用方式
第一种:
t := i.(T)
这个表达式可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T
,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic。(即nil或者接口对象类型不为T时均会触发panic)
eg;
func main() {var i interface{} = 10t1 := i.(int)fmt.Println(t1)fmt.Println("=====分隔线=====")t2 := i.(string)fmt.Println(t2)
}
可以发现在执行第二次断言的时候失败了,并且触发了 panic。
第二种
t, ok:= i.(T)
和上面一样,这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其值给 t,并且此时 ok 的值 为 true,表示断言成功。
如果接口值的类型,并不是我们所断言的 T,就会断言失败,但和第一种表达式不同的事,这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。
eg:
func main() {var i interface{} = 10t1, ok := i.(int)fmt.Printf("%d-%t\n", t1, ok)fmt.Println("=====分隔线1=====")t2, ok := i.(string)fmt.Printf("%s-%t\n", t2, ok)fmt.Println("=====分隔线2=====")var k interface{} // nilt3, ok := k.(interface{})fmt.Println(t3, "-", ok)fmt.Println("=====分隔线3=====")k = 10t4, ok := k.(interface{})fmt.Printf("%d-%t\n", t4, ok)t5, ok := k.(int)fmt.Printf("%d-%t\n", t5, ok)
}
类型断言(Type Switch)
如果需要区分多种类型,可以使用 type switch 断言,这个将会比一个一个进行类型断言更简单、直接、高效。
func findType(i interface{}) {switch x := i.(type) {case int:fmt.Println(x, "is int")case string:fmt.Println(x, "is string")case nil:fmt.Println(x, "is nil")default:fmt.Println(x, "not type matched")}
}
func main() {findType(10) // intfindType("hello") // stringvar k interface{} // nilfindType(k)findType(10.23) //float64
}
注:
-
类型断言,
仅能对静态类型为空接口(interface{})的对象进行断言
,否则会抛出错误。 -
类型断言完成后,实际上会返回静态类型为你断言的类型的对象,而要清楚原来的静态类型为空接口类型(interface{}),这是 Goang的隐式转换。