2017-09-15 86 views
0

在測試我的一些代碼庫時,我發現使用接口模擬「gopkg.in/mgo.v2」中的對象非常有用。我遇到了一個問題,其中mgo.Query沒有實現我的界面查詢。嘲諷mgo鏈接函數

import mgo "gopkg.in/mgo.v2" 

type Collection interface { 
    FindId(interface{}) Query 
    Find(interface{}) Query 
    UpdateId(interface{}, interface{}) error 
    Update(interface{}, interface{}) error 
    UpsertId(interface{}, interface{}) (interface{}, error) 
    Insert(...interface{}) error 
    RemoveId(interface{}) error 
} 

type Query interface { 
    One(interface{}) error 
    All(interface{}) error 
    Select(interface{}) Query 
} 

var _ Query = (*mgo.Query)(nil) 

查詢投踢了錯誤:

cannot use (*mgo.Query)(nil) (type *mgo.Query) as type Query in assignment: 
    *mgo.Query does not implement Query (wrong type for Select method) 
     have Select(interface {}) *mgo.Query 
     want Select(interface {}) Query 

這是不能夠在一個界面來定義鏈功能的問題?我不知道如何製作一個與mgo實現相匹配的Select標頭。

回答

0

函數簽名是不同的,這就是爲什麼你會遇到編譯錯誤。 Select的接口版本返回您的Query類型,而mgo的Select返回*mgo.Query,這是不同的類型。即使確實有實現您的接口,功能簽名仍然不同。您需要在此處添加另一個圖層,以便能夠包裝mgo包。

type MgoQuery struct { 
    *mgo.Query 
} 

func (q *MgoQuery) Select(selector interface{}) Query { 
    return q.Query.Select(selector) 
} 

...