2017-07-11 10 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

利用代わりに '* DockerClient' – Motakjuq

+0

@Motakjuq I」の' DockerClient' assertion-種類を行う必要があり、後でその時client.Clientでサポートされているすべてのメソッドを呼び出すしたい場合これを試しましたが、同じエラーが発生しました – sreya

+0

以前は見たことがありませんでしたが、 '&DockerUtil {....'は 'dockerClient'の代わりに' client'を使用しています – Motakjuq

答えて

1

インタフェースdo not useポインタ定義good read hereを定義するときは、まずinterface{}を使ってみましょう。

type DockerUtil struct{ 
    Client  DockerClient 
} 

そしてモービーClientメソッドの多くを実装し、あなたが選択する方法のためinterfaceを行いたいと思います。

正しい方法はタイプアサーションです。グッドリード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使用して、あなたのインターフェイスDockerClient以降のみPingメソッドを呼び出すことができますがPingメソッドの定義を持っています。


あなたは

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

私が今得たエラーは '非インターフェイスタイプ*クライアント左' – sreya

+0

私はそれを見つけました、私は間違った 'context'を使用していましたpkg – sreya

+0

それはあなたを助けますか? – jeevatkm

関連する問題