我正在尝试重构一些代码,以便为我在代码中使用的Docker client library使用依赖注入。我用我希望能够模拟的方法创建了一个接口
type DockerClient interface {
Ping(context.Context) (types.Ping, error)
}
func NewDockerUtil() (*DockerUtil, error) {
var dockerClient *DockerClient
var err error
dockerClient, err = client.NewEnvClient() //Reports incompatible types in binary and unary expressions.
if err != nil {
return nil, err
}
return &DockerUtil{
Client: dockerClient,
}, nil
}
type DockerUtil struct{
Client *DockerClient
}
但是当我尝试分配时,我得到Reports incompatible types in binary and unary expressions.
我究竟需要改变什么?
答案 0 :(得分:-1)
让我们开始使用interface{}
,当你定义界面时不要使用指针定义good read here。
type DockerUtil struct{
Client DockerClient
}
moby Client实现了很多方法,你想为选择性方法做interface
。
正确的方法是通过Type断言。好的阅读Effective Go - Type assertions和Spec - Type assertion。
注意: 试试此代码,我的机器中没有docker env进行测试。
func NewDockerUtil() (*DockerUtil, error) {
dockerClient, err := client.NewEnvClient()
if err != nil {
return nil, err
}
return &DockerUtil{
Client: dockerClient.(DockerClient),
}, nil
}
注意:强>
使用DockerUtil.Client
,您只能调用Ping
方法,因为您的界面DockerClient
已定义Ping
方法。
如果您想稍后调用client.Client
支持的所有方法,则必须进行类型断言 -
dockerClient := DockerUtil.Client.(*client.Client)