Decode以下代码的步骤未正确填充原始对象document。它用一个bson对象覆盖它。func main() { c := Call{} dbGetObject("collection", &c)}func dbGetObject(collectionName string, document interface{}) (err error) { uri, creds, auth := dbGetAuth() clientOpts := options.Client().ApplyURI(uri).SetAuth(creds) client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) return err } defer client.Disconnect(context.TODO()) collection := client.Database(auth.Database).Collection(collectionName) err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(&document) if err != nil { log.Fatal(err) return err } return nil}然而,以下代码确实可以正常工作:func dbGetObject(collectionName string) (err error) { uri, creds, auth := dbGetAuth() clientOpts := options.Client().ApplyURI(uri).SetAuth(creds) client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) return err } defer client.Disconnect(context.TODO()) collection := client.Database(auth.Database).Collection(collectionName) c := Call{} err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(&c) if err != nil { log.Fatal(err) return err } return nil}唯一的区别是结构的实例被传递到函数中而不是在函数中实例化dbGetObject。我究竟做错了什么
2 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
我真的意识到发生了什么。在调用函数然后调用解码时,我传递了一个指针。所以,它实际上是在将一个指针传递给解码调用。所以解决方法是改变解码调用:
err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(&document)
至
err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(document)
元芳怎么了
TA贡献1798条经验 获得超7个赞
在第一个示例中,文档的类型是interface
. 如果您将参数类型固定如下,它将正常工作。
func dbGetObject(collectionName string, document *Call)
- 2 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消