尝试注入依赖项时出错

时间:2017-07-11 01:55:03

标签: go

我正在尝试重构一些代码,以便为我在代码中使用的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.我究竟需要改变什么?

1 个答案:

答案 0 :(得分:-1)

让我们开始使用interface{},当你定义界面时不要使用指针定义good read here

type DockerUtil struct{
    Client        DockerClient
}

moby Client实现了很多方法,你想为选择性方法做interface

  

正确的方法是通过Type断言。好的阅读Effective Go - Type assertionsSpec - 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)