1

我有以下(未经测试的)功能:

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() }
}

我想给我的函数一个实现 interface 的结构MyInterface。然后它应该从 mongodb 中检索一些值并在检索到的结构上调用一个方法。

问题是error: reflect.Set: value of type bson.M is not assignable to type mypkg.MyInterface- 有什么方法可以使这项工作?我尝试tasks使用原始结构的类型进行实例化,但无法使其正常工作。

任何帮助将不胜感激 - 谢谢:)

4

1 回答 1

1

mgo无法创建MyInterface对象,因为 MyInterface 只是一个接口。尝试做:

myObject := &MyInterface{}  //fails

我认为这基本上mgo是它试图解组的每条记录所要做的事情。

要实现您想要tasks的,请使用 type[]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,因此上面的 map 切片选项。

另外,请谨慎使用Find(nil).All(&tasks). 如果您在该集合中有数百万条记录,则根据记录的大小,您可能会出现内存不足。

于 2013-02-21T15:22:58.123 回答