我正在尝试重构一些代码,以便对我在代码中使用的Docker client library使用依赖项注入(inject)。我用我想模拟的方法创建了一个接口(interface)

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.我到底需要更改什么?

最佳答案

让我们从使用interface{}开始,当您定义接口(interface)时不要使用指针定义good read here

type DockerUtil struct{
    Client        DockerClient
}

Moby Client实现了许多方法,您想为选择性方法做interface



注意:尝试以下代码,我的机器上没有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方法,因为您的接口(interface)DockerClient具有Ping方法的定义。

如果您以后想调用client.Client支持的所有方法,则必须输入assert-
dockerClient := DockerUtil.Client.(*client.Client)

10-07 19:06
查看更多