golang型別判斷
阿新 • • 發佈:2018-11-02
_.ok:=interface{}(a).(B)
此語句用於判斷物件a是否是B型別
也可以判斷物件a是否實現了B介面
package main import "fmt" type Pet interface { SetName(name string) Name()string Category()string } type Dog struct { name string } func (dog *Dog) SetName(name string) { dog.name = name } func(dog Dog) Name()string{ return dog.name } func (dog Dog)Category()string{ return "dog" } func main() { dog:=Dog{"little pig"} _,ok:=interface{}(dog).(Pet) fmt.Printf("Dog implements interface Pet: %v\n", ok) _, ok = interface{}(&dog).(Pet) fmt.Printf("*Dog implements interface Pet: %v\n", ok) fmt.Println()var pet Pet = &dog fmt.Printf("This pet is a %s, the name is %q.\n", pet.Category(), pet.Name()) }
輸出為:
Dog implements interface Pet: false *Dog implements interface Pet: true This pet is a dog, the name is "little pig".
一個指標型別實現了某某介面型別,但它的基本型別卻不一定能夠作為該介面的實現型別。
怎樣判定一個數據型別的某一個方法實現的就是某個介面型別中的某個方法呢?
這有兩個充分必要條件,一個是“兩個方法的簽名需要完全一致”,另一個是“兩個方法的名稱要一模一樣”。顯然,這比判斷一個函式是否實現了某個函式型別要更加嚴格一些。
這就意味著,Dog型別本身的方法集合中只包含了 2 個方法, 也就是所有的值方法。而它的指標型別*Dog方法集合卻包含了 3 個方法