go - 尝试注入(inject)依赖项时出错

标签 go

我正在尝试重构一些代码以对 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/

相关文章:

web-applications - 基于 go 的 Web 应用程序中的错误页面

json - 访问必要的字段 json golang

go - 传入任何结构作为接口(interface)方法

go - Go 中的 slice 类型有什么意义?

go - 在 Go slice 中,为什么 s[lo :hi] end at element hi-1?

string - Golang 中 Big Ints 前导零填充的 Format 方法的使用示例

go - 如何在 gRPC Protobuf 中创建接口(interface)类型?

image - golang api 图像下载中的图像文件损坏

arrays - 戈朗 : Byte insert into [ ] byte

go - 使用 KDF 在 Go 中使用 bcrypt 获取特定的输出 key 长度