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")
}
}