常常地咱們對一個接口值的動態類型是不肯定的,如方法的形參爲接口類型時,此時就須要檢驗它是否符合咱們須要的類型。
類型斷言是一個使用在接口值上的操做。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