Go的接口为我们提供了方便的duck typing能力,提供强有力的抽象能力。而且定义和使用接口也是非常方便,实现某个接口也不需要显式声明。宽松的规则能方便编码的同时,也会出现滥用的情况。
那什么时候要定义接口类型呢?
-
当需要用户提供内部实现细节时。如:http的handler,线程池的回调函数等。
-
当对外的API有多个内部实现的时。如:标准库的
Reader和Writer等有文件系统IO实现,网络IO实现,缓冲区IO实现等。 -
当部分API需要解耦扩充时。如:数据存储功能需要添加其他存储方式,需要对现有部分功能进行解耦扩充。
那什么时候不要定义接口类型?
- 接口定义的函数与类实现的函数完全一致时。
- 不要为了测试,特意定义接口。
- 标准库有相同行为的接口类型时。
- 犹豫要不要用定义接口类型时。