接口的实现
package main import "fmt" type Animal interface { //出生 SayHelloWord() //死亡 Godie() //生活 Live(food string) (Energy int) } type Pig struct { Name string } /*猪的指针实现了动物接口*/ //出生 func (p *Pig)SayHelloWord(){ fmt.Printf("%s哼哼哼 ",p.Name) } //死亡 func (p *Pig)Godie(){ fmt.Printf("%s啊啊啊我死了 ",p.Name) } //生活 func (p *Pig)Live(food string) (Energy int){ fmt.Printf("%s食用了一些%s,生产了%d卡路里 ",p.Name,food,1200) return 1200 } type Cat struct { Name string } /*猫的指针实现了动物接口*/ //出生 func (c *Cat)SayHelloWord(){ fmt.Printf("%s出生了 ",c.Name) } //死亡 func (c *Cat)Godie(){ fmt.Printf("%s:糟了life-=1 ",c.Name) } //生活 func (c *Cat)Live(food string)(Energy int){ fmt.Printf("铲屎官给%s大人服用了一些%s ",c.Name,food) return 1 } func main031() { var animal Animal /*一个动物实例,既可以指向一只猪的指针,又可以指向一只猫的指针*/ //animal = &Pig{"佩奇"} animal = &Cat{"加菲"} /*无视当前的animal的具体类型,调度其动物的共性*/ animal.SayHelloWord() animal.Godie() animal.Live("饲料") } /*开一个肉联厂*/ func main() { animals := make([]Animal, 0) animals = append(animals, &Pig{"佩奇"}) animals = append(animals, &Cat{"加菲"}) for _,animal := range animals{ animal.Live("饲料") animal.Godie() } }
接口的类型断言
package main import "fmt" type Animal interface { //出生 SayHelloWord() //死亡 Godie() //生活 Live(food string) (Energy int) } type Pig struct { Name string } /*猪的指针实现了动物接口*/ //出生 func (p *Pig)SayHelloWord(){ fmt.Printf("%s哼哼哼 ",p.Name) } //死亡 func (p *Pig)Godie(){ fmt.Printf("%s啊啊啊我死了 ",p.Name) } //生活 func (p *Pig)Live(food string) (Energy int){ fmt.Printf("%s食用了一些%s,生产了%d卡路里 ",p.Name,food,1200) return 1200 } func (p *Pig)Gongniba() { fmt.Printf("%s在拱泥巴 ", p.Name) } type Cat struct { Name string } /*猫的指针实现了动物接口*/ //出生 func (c *Cat)SayHelloWord(){ fmt.Printf("%s出生了 ",c.Name) } //死亡 func (c *Cat)Godie(){ fmt.Printf("%s:糟了life-=1 ",c.Name) } //生活 func (c *Cat)Live(food string)(Energy int){ fmt.Printf("铲屎官给%s大人服用了一些%s ",c.Name,food) return 1 } func (c *Cat)Gulu() { fmt.Printf("%s咕噜咕噜 ",c.Name) } func main031() { var animal Animal /*一个动物实例,既可以指向一只猪的指针,又可以指向一只猫的指针*/ //animal = &Pig{"佩奇"} animal = &Cat{"加菲"} /*无视当前的animal的具体类型,调度其动物的共性*/ animal.SayHelloWord() animal.Godie() animal.Live("饲料") } /*开一个肉联厂*/ func main() { animals := make([]Animal, 0) animals = append(animals, &Pig{"佩奇"}) animals = append(animals, &Cat{"加菲"}) /* for _,animal := range animals{ switch animal.(type) { case *Cat: fmt.Printf("发现一只猫:%v ",animal) case *Pig: fmt.Printf("发现一只猪:%v ",animal) } }*/ for _,animal := range animals{ cat,ok:= animal.(*Cat) if ok{ cat.Gulu() } fmt.Println(animal,cat,ok) pig,ok:= animal.(*Pig) if ok{ pig.Gongniba() } fmt.Println(animal,pig,ok) } }
空接口与空接口的类型断言
package main import "fmt" func main() { //空接口可以看做各种类型 data := make([]interface{}, 0) data = append(data, "你妹") data = append(data, 18) data = append(data, 0.5) data = append(data, false) /*for _,x := range data{ switch x.(type) { case string: fmt.Println("发现字符串",x) case int: fmt.Println("发现整型",x) case float64: fmt.Println("发现浮点型",x) default: fmt.Println("发现其他类型",x) } }*/ for _,x := range data{ if xStr,ok := x.(string);ok{ fmt.Printf("发现字符串%s,长度是%d ",xStr,len(xStr)) }else { fmt.Println("其他类型",x) } } }