嘲讽mgo链接函数

问题描述:

在测试我的一些代码库时,我发现使用接口模拟“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标头。

函数签名是不同的,这就是为什么你会遇到编译错误。 Select的接口版本返回您的Query类型,而mgo的Select返回*mgo.Query,这是不同的类型。即使确实有实现您的接口,功能签名仍然不同。您需要在此处添加另一个图层,以便能够包装mgo包。

type MgoQuery struct { 
    *mgo.Query 
} 

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

...