之前的文章《Golang中的interface(接口)详解与最佳实践》详细介绍了接口类型的定义、使用方法和最佳实践。接口类型使得编写可扩展、可维护和可复用的高质量代码变得更加容易。
如何判断是否实现了某个接口?
还是使用之前文章的例子,例如声明了如下一个接口MyInterface:
type MyInterface interface {Method1()Method2() int
}
这个接口定义了两个方法Method1和Method2。
对于任何类型数据,只要它的方法中包含Method1和Method2并且形参和返回值也与Method1和Method一致,那么它就实现了MyInterface接口。这是一种无侵入式的接口实现方式,这种方式也叫做duck typing(在程序设计中,duck typing(鸭子类型)是动态类型的一种风格,即一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定)。当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。
可以看出某个类型数据是否是某个接口的实现需要满足如下条件:这个类型数据的方法中包含了接口定义的全部方法并且形参和返回值一致。
接口嵌套
接口嵌套,也称为接口组合,只要把一个接口的名称直接写到另一个接口的成员列表中就可以了,例如:
type MyInterface interface {Method1()Method2() int
}type MyInterface2 interface {MyInterfaceMethod3() string
}
接口MyInterface2包含了两个成员,一个是MyInterface类型的,一个是Method3方法。此时,MyInterface2也包含了Method1和Method2方法。
Golang官方推荐定义小粒度的接口,因为小粒度的接口只负责表达某类特征,通过灵活组合可以实现更强大的功能。Golang很多标准库中都采用了这种思路,例如io库中,看如下代码片段:
// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {ReaderWriter
}// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {ReaderCloser
}
其中ReadWriter接口由Reader和Writer接口组合而成,ReadCloser接口由Reader和Closer接口组合而成。