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