我有以下(未经测试的)功能:
func Execute(task MyInterface) {
db := session.DB(task.Database()).C(task.Collection())
var tasks []MyInterface
db.Find(nil).All(&tasks)
for _, t := range tasks { t.Do() }
}
我想给我的函数一个实现接口MyInterface
的结构。然后它应该从mongodb中检索一些值并在检索到的结构上调用一个方法。
问题是error: reflect.Set: value of type bson.M is not assignable to type mypkg.MyInterface
- 是否有某种方法可以使这项工作?我尝试使用原始结构的类型实例化tasks
,但无法使其正常工作。
任何帮助将不胜感激 - 谢谢:)
答案 0 :(得分:1)
mgo
无法创建MyInterface
个对象,因为MyInterface只是一个接口。尝试做:
myObject := &MyInterface{} //fails
我认为这基本上是mgo
试图为每个试图解组的记录做的事情。
要实现您想要的效果,请设置tasks
类型的[]map[string]interface{}
或[]bson.M
(后者是前者的别名),然后:
for _, o := range tasks {
t := &MyTypeThatImplementsMyInterface{
Field1 : o["my_field"],
//etc.
}
t.Do()
}
或者使tasks
实现var tasks []MyStructType
的类型(MyInterface
)的对象切片,并且其字段与数据库中bson对象的键和值类型匹配。如果您的存储数据是多个实现MyInterface
的类型,那么这可能不起作用,因此上面的切片选项。
另外,请谨慎对待Find(nil).All(&tasks)
。如果您在该集合中有数百万条记录,则根据记录大小,您可能会遇不到记忆。