go語言實現接口查詢
一句話總結:如果接口A實現瞭接口B中所有方法,那麼A可以轉化為B接口。
package options type IPeople interface { GetName() string } type IPeople2 interface { GetName() string GetAge() int } package main import ( "fmt" "options" ) type person struct { name string } func (p *person) GetName() string { return p.name } type person2 struct { name string age int } func (p *person2) GetName() string { return p.name } func (p *person2) GetAge() int { return p.age } func main() { //p不可以轉化為options.IPeople2接口,沒有實現options.IPeople2接口中的GetAge() var p options.IPeople = &person{"jack"} if p2, ok := p.(options.IPeople2); ok { fmt.Println(p2.GetName(), p2.GetAge()) } else { fmt.Println("p不是Ipeople2接口類型") } //p2可以轉化為options.IPeople接口,因為實現瞭options.IPeople接口的所有方法 var p2 options.IPeople2 = &person2{"mary", 23} if p, ok := p2.(options.IPeople); ok { fmt.Println(p.GetName()) } var pp options.IPeople = &person{"alen"} if pp2, ok := pp.(*person); ok { fmt.Println(pp2.GetName()) //pp接口指向的對象實例是否是*person類型,*不能忘 } switch pp.(type) { case options.IPeople: fmt.Println("options.IPeople") //判斷接口的類型 case options.IPeople2: fmt.Println("options.IPeople2") default: fmt.Println("can't found") } var ii interface{} = 43 //默認int類型 switch ii.(type) { case int: fmt.Println("int") default: fmt.Println("can't found") } }
補充:golang中Any類型使用及空接口中類型查詢
1.Any類型
GO語言中任何對象實例都滿足空接口interface{},空接口可以接口任何值
var v1 interface{} = 1 var v2 interface{} = "abc" var v3 interface{} = 2.345 var v4 interface{} = make(map[..]...) ....
2.1 關於空接口的類型查詢方式一,使用ok
package main import "fmt" //空接口可以接受任何值 //interface { } func main() { var v1 interface{ } v1 = 6.78 //賦值一個變量v判斷其類型是否為float64,是則為真,否則,為假 if v, ok := v1.(float64);ok{ fmt.Println(v, ok) }else { fmt.Println(v,ok) } }
2.2 關於空接口類型查詢方式二,switch語句結合 var.type()
package main import "fmt" //空接口可以接受任何值 //interface { } func main() { var v1 interface{ } v1 = "張三" switch v1.(type) { case float32: case float64: fmt.Println("this is float64 type") case string: fmt.Println("this is string type") } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。