什么是接口
在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。
接口是一系列方法的集合
例如:鸭子会叫会跑,叫起来像,跑起来像就是鸭子
语法
type 接口名 interface{
方法一
方法二
}
package main import "fmt" type Duck interface{ //定义一个鸭子接口 speak() run() } 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(pD) speak(tD) } func speak(p Duck){ //只要是鸭子类型就能说话 p.speak() }
类型断言
类型断言用于提取接口的底层值(Underlying Value)。
在语法 i.(T)
中,接口 i
的具体类型是 T
,该语法用于获得接口的底层值。
就比如上面的旱鸭子就是鸭子类型
package main import "fmt" type Duck interface{ //定义一个鸭子接口 speak() run() } 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() { tD:=TDuck{name:"旱老鸭"} speak(tD) } func speak(p Duck) { //类型断言,我断言你是TDuck类型,如果没有问题,转成TDuck类型 a:=p.(TDuck) fmt.Println(a.wife) p.speak() }
类型选择
类型选择用于将接口的具体类型与很多 case 语句所指定的类型进行比较。它与一般的 switch 语句类似。唯一的区别在于类型选择指定的是类型,而一般的 switch 指定的是值。
类型选择的语法类似于类型断言。类型断言的语法是 i.(T)
,而对于类型选择,类型 T
由关键字 type
代替。
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 speak(p Duck) { switch a:=p.(type) { case PDuck: //判断好了,你是普通鸭子,把鸭子名字拿出来 fmt.Println("你是普通鸭子") fmt.Println(a.name) case TDuck: //判断好了,你是唐老鸭,把唐老鸭的wife拿出来 fmt.Println("你是唐老鸭") fmt.Println(a.wife) } }
匿名空接口
所有的数据类型都实现了空接口
package main import "fmt" type Empty interface { } type TDuck2 struct { name string age string wife bool } func main() { test(1) test("ssss") test(TDuck2{}) test(10.45) } func test(a interface{}) { switch a.(type) { case int: fmt.Println("你是int类型") case string: fmt.Println("你是string ") case TDuck2: fmt.Println("你是唐老鸭") default: fmt.Println("我不知道你是什么类型") } }