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接口值 i1i2 才相等(既表达式 i1==i2true):

  • i1 的具体类型与 i2 的具体类型相同,且该类型可比
  • i1 的具体值与 i2 的具体值相等