英文:
Mocking mgo chaining functions
问题
在测试我的代码库时,我发现使用接口来模拟"gopkg.in/mgo.v2"中的对象非常有用。我遇到了一个问题,mgo.Query没有实现我的接口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)
Query的转换引发了错误:
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头部。
英文:
While testing some of my codebase I found it useful to mock out objects from "gopkg.in/mgo.v2" with interfaces. I'm running into a problem where mgo.Query does not implement my interface 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)
The Query cast kicks up the error:
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
Is this a problem with chain functions not being able to be defined in an interface? I'm not sure how to make a Select header that will match the mgo implementation.
答案1
得分: 1
函数签名不同,这就是为什么你遇到了编译错误。你的接口版本的Select
函数返回你的Query
类型,而mgo的Select
函数返回*mgo.Query
,这是一个不同的类型。即使该类型实现了你的接口,函数签名仍然不同。你需要在这里添加另一层,以便能够包装mgo包。
type MgoQuery struct {
*mgo.Query
}
func (q *MgoQuery) Select(selector interface{}) Query {
return q.Query.Select(selector)
}
...
英文:
The function signatures are different, which is why you're running into a compilation error. Your interface version of Select
returns your Query
type, while mgo's Select
returns *mgo.Query
, which is a different type. Even if that type does implement your interface, the function signatures are still different. You will need to add another layer to this where you are able to wrap the mgo package.
type MgoQuery struct {
*mgo.Query
}
func (q *MgoQuery) Select(selector interface{}) Query {
return q.Query.Select(selector)
}
...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论