7.4. 接口的其它特性
在声明接口时,接口的方法集可以包含另一个接口,例如:
type I1 interface {
f1()
}
type I2 interface {
I1
f2()
}
使用该形式,编译器会将接口 I1
的方法拷贝至 I2
的方法集中,这与直接在 I2
的方法集中增加 f1()
是等价的。
如果接口 I2
的方法集是接口 I1
方法集的真超集,我们称“与I1相比,I2是小接口”,这一说法看起来有些反直觉,其内在逻辑在于:接口是方法合约,由于 I2
中的方法更多,因此满足 I2
的类型的集合,一定是满足 I1
的类型的集合的子集——或者说满足 I2
的类型少等于满足I1
的类型。从这个角度来说,空接口(interface{}
)是最大的接口,非空接口中所包含的方法越多,接口倾向于越小。
我们也可以声明匿名接口值,匿名接口各方面都与匿名结构体类似,它们都位于全局名字空间(可跨模块使用)。
接口调用比具体类型直接调用略慢,因此没有必要为只有一种类型满足的行为(或者说方法集)创建接口。
接口值是可比的,只有同时满足以下条件,两个非nil接口值 i1
、i2
才相等(既表达式 i1==i2
为 true
):
i1
的具体类型与i2
的具体类型相同,且该类型可比i1
的具体值与i2
的具体值相等