类型选择

类型选择 是一种按顺序从几个类型断言中选择分支的结构。

类型选择与一般的 switch 语句相似,不过类型选择中的 case 为类型(而非值), 它们针对给定接口值所存储的值的类型进行比较。

  1. switch v := i.(type) {
  2. case T:
  3. // v 的类型为 T
  4. case S:
  5. // v 的类型为 S
  6. default:
  7. // 没有匹配,v 与 i 的类型相同
  8. }

类型选择中的声明与类型断言 i.(T) 的语法相同,只是具体类型 T 被替换成了关键字 type

此选择语句判断接口值 i 保存的值类型是 T 还是 S。在 TS 的情况下,变量 v 会分别按 TS 类型保存 i 拥有的值。在默认(即没有匹配)的情况下,变量 vi 的接口类型和值相同。

type-switches.go

  1. package main
  2. import "fmt"
  3. func do(i interface{}) {
  4. switch v := i.(type) {
  5. case int:
  6. fmt.Printf("Twice %v is %v\n", v, v*2)
  7. case string:
  8. fmt.Printf("%q is %v bytes long\n", v, len(v))
  9. default:
  10. fmt.Printf("I don't know about type %T!\n", v)
  11. }
  12. }
  13. func main() {
  14. do(21)
  15. do("hello")
  16. do(true)
  17. }