接口是一种抽象类型。
接口描述了一套方法集里的所有方法,并为每个方法提供签名。
使用interface关键字要创建接口,后跟大括号,里面是方法签名列表。
接口就像是方法集的蓝图,这些方法在使用前必须先实现。满足了接口所有方法的类型则称为实现接口。
定义满足接口的类型
先定义名字为Employee的接口类型,它具有两个方法。
然后定义想要满足Employee接口的名字为Emp的用户定义类型。
最后通过声明接收器的方式在Emp上定义了实现接口需要的所有方法,叫作这个类型满足或实现接口。
如果一个类型已经具有了接口中声明的所有方法,不需要显式声明该类型满足接口。
声明一个接口变量e1,然后创建一个Emp值并赋值给e1,通过接口变量调用方法,Emp值成为接口e1的具体值。
定义满足多个接口的类型
接口允许任何用户定义的类型同时满足多个接口。
使用类型断言,从接口返回底层具体类型的值,在具体值上调用在其他接口上定义的方法
当用户定义类型实现由接口类型声明的方法集时,可以将用户定义类型的值赋给接口变量。此赋值将用户定义类型的值存储到接口变量中。当对接口值进行方法调用时,执行的是存储的用户定义类型值上的等效方法。由于任何用户定义的类型都可以实现任何接口,因此对接口值的方法调用本质上是多态的。此关系中的用户定义类型通常称为接口的具体类型,值称为接口的具体值。
公共方法的接口
两个或多个接口在方法集列表中可以有一个或多个公共方法。以下示例中,Structure是Vehicle和Human两个接口之间的公共方法。
结果:
ECU <=====> Brain
Engine <=====> Heart
Air Filters <=====> Nose
Wipers <=====> Eyelashes
Gas Task <=====> Stomach
接受变量地址或指针的接口
Print()方法签名中声明的是接收器类型为指针。因此,接口变量接受的值也必须是与接收器相同类型的指针。
如果方法普通类型的接收器,则接口必须接收普通类型的值;如果方法具有指针接收器,则接口必须接收相应类型变量的地址。
空接口类型
类型interface{}称为空接口,用于接受任何类型的值。空接口没有任何需要满足的方法,因此每种类型都满足它。
manyType变量被声明为类型接口{},因此可以为其赋予不同类型的值。printType()函数接受类型interface{}的参数,因此此函数可以接受任何有效类型的值。
结果:
100
200.5
Germany
Go programming language
[india japan canada australia russia]
map[Mark:10 Sandy:20]
[Japan Australia Germany]
多态性
多态性是指通过多种类型的实现相同接口以达到可以执行不同行为的能力。
声明声明结构Pentagon,Hexagon,Octagon和Decagon以及它们对Geometry接口的实现。
结果:
25
30
40
50
多态函数Parameter接受的参数是实现了Geometry接口的值,传入的每个具体类型值使用函数Edges实现相应的功能。
接口嵌入
接口可以嵌入其他接口,这种行为是接口多态性的一个方面,称为临时多态性。
当一个类型嵌入到另一个类型中时,嵌入类型的方法对外层类型可用。外层接口可以直接访问嵌套接口的方法。