常常地咱们对一个接口值的动态类型是不肯定的,如方法的形参为接口类型时,此时就须要检验它是否符合咱们须要的类型。
类型断言是一个使用在接口值上的操做。html
若是对Golang的接口和接口值的概念不熟悉,看这里:Go的接口总结
断言类型的语法:x.(T),这里x表示一个接口的类型,T表示一个类型(也可为接口类型)。
一个类型断言检查一个接口对象x的动态类型是否和断言的类型T匹配。spa
类型断言分两种状况:
第一种,若是断言的类型T是一个具体类型,类型断言x.(T)就检查x的动态类型是否和T的类型相同。
htm
第二种,若是断言的类型T是一个接口类型,类型断言x.(T)检查x的动态类型是否知足T接口。
对象
注意:
blog
示例代码:接口
//===接口===== type Tester interface { getName()string } type Tester2 interface { printName() } //===Person类型==== type Person struct { name string } func (p Person)getName() string { return p.name } func (p Person) printName() { fmt.Println(p.name) } //============ func main() { var t Tester t = Person{"xiaohua"} check(t) } func check(t Tester) { //第一种状况 if f, ok1 := t.(Person);ok1 { fmt.Printf("%T\n%s\n",f,f.getName()) } //第二种状况 if t, ok2 := t.(Tester2);ok2 { //重用变量名t(无需从新声明) check2(t) //若类型断言为true,则新的t被转型为Tester2接口类型,但其动态类型和动态值不变 } } func check2(t Tester2) { t.printName() }
执行结果:get
main.Person
xiaohua
xiaohuastring