为了使代码更容易测试,强调使用接口而不是具体类型.我想知道为什么没有为像DB或Rows这样的sql包中的类型做这个.为了模拟这些依赖项,我必须创建自己的接口,以便我可以编写单元测试(而不是集成测试).是不是面向DB的代码应该以这种方式进行测试?
当您向接口添加方法时,在公共 API 中公开接口而不是具体类型会增加破坏其他人代码的风险。
参见示例os.File
。如果os.File
是一个接口,那么它将是一个具有 17 个公共方法的接口。添加第 18 个方法会破坏所有定义自己的实现该os.File
接口的类型的人。相反,向当前os.File
结构添加第 18 个方法不会破坏任何采用 的方法io.Reader
,io.Writer
或定义 的方法子集的任何其他接口os.File
。它也不会破坏模拟这些io.Reader
和io.Writer
接口的测试代码。
因此,如果您希望其他人定义自己的接口实现,请在公共 API 中公开一个接口。否则,公开具体类型并让人们仅使用他们需要的方法子集来定义由具体类型实现的自己的接口。