我正在尝试重构一些代码,以便对我在代码中使用的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)