模拟 mgo 链接函数
Mocking mgo chaining functions
在测试我的一些代码库时,我发现使用接口从 "gopkg.in/mgo.v2" 模拟出 objects 很有用。我 运行 遇到了 mgo.Query 没有实现我的接口查询的问题。
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 header。
函数签名不同,这就是您 运行 陷入编译错误的原因。你的界面版本是Select
returns你的Query
类型,而mgo的是Select
returns*mgo.Query
,这是一种不同的类型。即使该类型 确实 实现了您的接口,函数签名仍然不同。您将需要为此添加另一层,您可以在其中包装 mgo 包。
type MgoQuery struct {
*mgo.Query
}
func (q *MgoQuery) Select(selector interface{}) Query {
return q.Query.Select(selector)
}
...
在测试我的一些代码库时,我发现使用接口从 "gopkg.in/mgo.v2" 模拟出 objects 很有用。我 运行 遇到了 mgo.Query 没有实现我的接口查询的问题。
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 header。
函数签名不同,这就是您 运行 陷入编译错误的原因。你的界面版本是Select
returns你的Query
类型,而mgo的是Select
returns*mgo.Query
,这是一种不同的类型。即使该类型 确实 实现了您的接口,函数签名仍然不同。您将需要为此添加另一层,您可以在其中包装 mgo 包。
type MgoQuery struct {
*mgo.Query
}
func (q *MgoQuery) Select(selector interface{}) Query {
return q.Query.Select(selector)
}
...