为什么GO语言中数据库类型不是接口

7

为了使代码更易于测试,强调使用接口而不是具体类型。然而,我想知道为什么在sql包中的DB或Rows等类型没有这样做。为了模拟这些依赖项,我不得不创建自己的接口,以便编写单元测试(非集成测试)。难道DB面向的代码不应该这样测试吗?


1
任何人都可以在Go中为任何类型创建接口。这意味着您不需要声明您不使用的接口。正如您所注意到的,没有任何现有接口并不妨碍您创建所需的接口。 - Denys Séguret
当然,我明白。但是我遇到了很多Gopher强调事先使用接口,以使其他人更容易模拟具体类型。也许我想太多了。谢谢。 - Amir Keibi
2
@AmirKeibi:接口确实使模拟变得更容易,但这并不意味着包维护者应该创建完全基于接口的包。有一个包可以让你轻松地模拟 database/sql 的东西:go-sqlmock,也许可以看一下? - Elias Van Ootegem
1个回答

1

将接口暴露在公共API中,而不是具体类型,会增加向接口添加方法时破坏他人代码的风险。

例如,可以查看os.File。如果os.File是一个接口,那么它将是一个具有17个公共方法的接口。添加第18个方法将破坏所有定义了自己的类型来实现os.File接口的人。相比之下,向当前的os.File结构添加第18个方法不会破坏任何采用io.Readerio.Writer或任何其他定义了os.File方法子集的接口的方法。这也不会破坏模拟这些io.Readerio.Writer接口的测试代码。

如果您希望其他人定义自己的实现,则在公共API中暴露接口。否则,暴露具体类型并允许人们仅使用所需方法的子集定义自己的接口,由具体类型实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接