1.接口的定义
接口是一系列方法的集合。接口指定了一个类型应该要具有的方法,但是由该类型决定如何去实现这些方法。
2.鸭子接口
package main import "fmt" # 定义了一个鸭子接口 type Duck interface { run() speak() } #定义普通鸭子结构体 type PDuck struct { name string age string } func (p PDuck)run() { fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭") } func (p PDuck)speak() { fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话") } #定义一个唐老鸭,实现鸭子接口 type TDuck struct { name string age string wife bool } func (p TDuck)run() { fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭") } func (p TDuck)speak() { fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话") } func main() { pD:=PDuck{name:"水鸭子"} tD:=TDuck{name:"唐老鸭"} speak(tD) speak(pD) } func speak(p PDuck) { p.speak() } func speak2(p TDuck) { p.speak() } func speak(p Duck) { p.speak() } #我想在函数中拿出唐老鸭的wife属性 //func speak(p Duck) { // //类型断言,我断言你是TDuck类型,如果没有问题,转成TDuck类型 // a:=p.(TDuck) // fmt.Println(a.wife) // p.speak() //} func speak(p Duck) { switch a:=p.(type) { case PDuck: //判断好了,你是普通鸭子,把鸭子名字拿出来 fmt.Println("你是普通鸭子") fmt.Println(a.name) case TDuck: //判断好了,你是唐老鸭,把唐老鸭的wife拿出来 fmt.Println("你是唐老鸭") fmt.Println(a.wife) } }
3.空接口
没有包含方法的接口称为空接口,空接口常表示为 interface{ }。由于空接口没有方法,因此所有类型都实现了空接口。