基本介绍

由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。

代码

  1. // 此案例演示类型断言 assert
  2. package main
  3. import (
  4. "fmt"
  5. )
  6. type Point struct {
  7. x int
  8. y int
  9. }
  10. func main() {
  11. // 定义空接口
  12. var a interface{}
  13. var point Point = Point{1, 2}
  14. a = point // OK
  15. fmt.Println("a = ", a)
  16. // 怎么把 空接口 赋值给 变量
  17. var b Point
  18. // cannot use a (type interface {}) as type Point in assignment: need type assertion
  19. // b = a // ERR
  20. b = a.(Point) // 类型断言
  21. /*
  22. b = a.(Point) // 类型断言
  23. 表示判断 a 是否是指向 Point 类型的变量,(上面 a = point 代码,a已经指向了Point)
  24. 如果是,就把 a 转换成 Point 类型,并赋给 b 变量
  25. 否则,就报错 (把上面 a = point 代码 去掉,就报错,类型推导不出来)
  26. */
  27. fmt.Println("b = ", b)
  28. // 类型断言 float32 - interface{}
  29. var m float32
  30. var x interface{}
  31. x = m
  32. n := x.(float32)
  33. fmt.Printf("n 类型: %T, 值: %v \n", n, n)
  34. // n 类型: float32, 值: 0
  35. // 带检测的类型断言
  36. n2, ok := x.(float64)
  37. if ok {
  38. fmt.Println("convert success")
  39. fmt.Printf("n2 类型: %T, 值: %v \n", n2, n2)
  40. } else {
  41. fmt.Println("convert error")
  42. }
  43. // panic: interface conversion: interface {} is float32, not float64
  44. /* if n2, ok := x.(float64); ok {
  45. } */
  46. fmt.Println("panic 之后还会执行吗")
  47. }

使用类型断言的时候,如果类型不匹配,就会报 panic 错误,因此在进行类型断言的时候,要确保原先空接口指向的就是要断言的类型。