类型断言用过吗,说说实现,如何判断断言成功?

题目来源:字节跳动

答案1:

第一种:

  1. 格式 t := i.(T),这个表达式可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic
  1. ackage main
  2. import "fmt"
  3. func main() {
  4. var i interface{} = 10
  5. t1 := i.(int)
  6. fmt.Println(t1)
  7. fmt.Println("=====分隔线=====")
  8. t2 := i.(string)
  9. fmt.Println(t2)
  10. }

第二种:

​ 格式 t, ok:= i.(T),这个表达式也是可以断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T,如果断言成功,就会返回其类型给 t,并且此时 ok 的值 为 true,表示断言成功。这个不会触发 panic,而是将 ok 的值设为 false ,表示断言失败,此时t 为 T 的零值。

  1. package main
  2. import "fmt"
  3. func main() {
  4. var i interface{} = 10
  5. t1, ok := i.(int)
  6. fmt.Printf("%d-%t
  7. ", t1, ok)
  8. fmt.Println("=====分隔线1=====")
  9. t2, ok := i.(string)
  10. fmt.Printf("%s-%t
  11. ", t2, ok)
  12. fmt.Println("=====分隔线2=====")
  13. var k interface{} // nil
  14. t3, ok := k.(interface{})
  15. fmt.Println(t3, "-", ok)
  16. fmt.Println("=====分隔线3=====")
  17. k = 10
  18. t4, ok := k.(interface{})
  19. fmt.Printf("%d-%t
  20. ", t4, ok)
  21. t5, ok := k.(int)
  22. fmt.Printf("%d-%t
  23. ", t5, ok)
  24. }