Golang 编程中有个最佳实践是将依赖定义为 interface 而返回定义为 struct。

interface in

这里包含两层意思,

  • 依赖定义成 interface
  • 这个 interface 应该在调用方定义

因为 interface 是 duck typing 的,只要满足 interface 定义的约束就可作为入参,这有助于将调用方与被调用方解耦。

具体来说,比如有个用于创建查询用户信息的服务:

UserStore

同时创建一个实现了该接口方法的模块:

PGStore

同理,编写单元测试也会方便许多,我们只需要 mock 一个实现了该接口的对象即可,因为 interface 的依赖已经通过抽象剥离了出来,使得测试变得方便和纯粹。

UserService

struct out

而我们函数的返回应该是 struct 类型。这样在调用后得到提具体的类型,上面的字段是清晰的,不用再次作类型转换。

error

相关资源