Go语言编程基础 方法与接口(三)——类型断言、类型选择

12 类型断言

类型断言提供了访问接口值底层具体值的方式。

t := i.(T)

note:断言接口值i保存了具体类型T,并将底层类型为T的值赋予变量t。
note:若i并未保存T类型的值,该语句触发一个panic。

为了判断一个接口值是否保存了一个特定的类型,类型断言可返回两个值:其底层值以及一个报告断言是否成功的布尔值。

t, ok := i.(T)

note:如果i保存了一个T,那么t将会是其底层值,而ok为true。
note:否则,ok将为false,而t将为T类型的零值,程序并不会产生panic。

package main

import "fmt"

func main()  {
  var ii interface{} = "hhh"
  t := ii.(string)
  fmt.Println(t)

  sk, ok := ii.(string)
  fmt.Println(sk, ok)

  ik, ok := ii.(int)
  fmt.Println(ik, ok)
}

13 类型选择

类型选择是一种按顺序从几个类型断言中选择分支的结构。
类型选择与一般的switch语句相似,不过类型选择中的case为类型(而非值),它们针对给定接口值所存储的值的类型进行比较。

switch v := i.(type) {
case:T:
case: S:
default:
}

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

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

package main

import "fmt"

func main()  {
  var i interface{} = "ssss"
  switch i.(type) {
  case int:
    fmt.Println("int")
  case string:
    fmt.Println("string")
  default:
    fmt.Println("don't know")
  }
}

学习源:Go 指南

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/83896883