类型断言提供对接口值的底层具体值的访问。
t := i.(T)
该语句断言接口值i
持有具体类型T
,并将底层T
值赋给变量t
。
如果i
不持有T
,该语句将触发恐慌panic
。
要测试接口值是否包含特定类型,类型断言可以返回两个值:底层值和报告断言是否成功的布尔值。
t, ok := i.(T)
如果i
持有T
,那么t
的值就是底层值,ok
就会为真。
如果不是,ok
就会为假t
就是类型T
的零值,不会出现恐慌panic
。
请注意此语法与从映射读取的语法之间的相似性。
Type switches
类型开关是一种允许在系列中使用多个类型断言的结构。
类型开关类似于常规的switch语句,但是类型开关中的用例指定类型(不是值),并且将这些值与给定接口值所包含的值的类型进行比较。
switch v := i.(type) {
case T:
// here v has type T
case S:
// here v has type S
default:
// no match; here v has the same type as i
}
类型开关中的声明与类型断言i.(T)
具有相同的语法,但是特定类型T
被关键字type
替换。
package main
import "fmt"
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Twice %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func main() {
do(21)
do("hello")
do(true)
}
// ==============================
Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool!