2017-07-11 58 views
1

我想重构一些代码使用依赖注入的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

使用以后再由client.Client支持的所有方法'DockerClient',而不是'* DockerClient' – Motakjuq

+0

@Motakjuq我”已经试过这个,但你得到了同样的错误 – sreya

+0

我没有看到它,但'&DockerUtil {....'使用'client'而不是'dockerClient' – Motakjuq

回答

1

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

type DockerUtil struct{ 
    Client  DockerClient 
} 

与白鲸Client实现了很多方法,你想为选择性的方法做interface

正确的做法是通过Type断言。好阅读Effective Go - Type assertionsSpec - Type assertion

注:试试这个代码,我没有搬运工人ENV在我的机器上进行测试。

func NewDockerUtil() (*DockerUtil, error) { 
    dockerClient, err := client.NewEnvClient() 
    if err != nil { 
     return nil, err 
    } 
    return &DockerUtil{ 
     Client:  dockerClient.(DockerClient), 
    }, nil 
} 

注:

使用DockerUtil.Client,则只能拨打Ping的方法,因为你的接口DockerClientPing方法的定义。


如果你想打电话给你要做的类型assertion-

dockerClient := DockerUtil.Client.(*client.Client) 
+0

我现在得到的错误是'非接口类型*客户端在左边' – sreya

+0

我想通了,我使用了错误的'context' pkg – sreya

+0

它对你有帮助吗? – jeevatkm