我正在尝试重构一些代码以对 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
}
还有白鲸Client实现了很多方法,你想为选择性方法做 interface
。
Right way to do is via Type assertion. Good read Effective Go - Type assertions and 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
方法,因为您的接口(interface) DockerClient
定义了 Ping
方法。
如果您想稍后调用client.Client
支持的所有方法,那么您必须进行类型断言-
dockerClient := DockerUtil.Client.(*client.Client)
关于go - 尝试注入(inject)依赖项时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45024152/