如何将mongodb解码结构传递给函数

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。我究竟做错了什么


繁华开满天机
浏览 154回答 2
2回答

一只名叫tom的猫

我真的意识到发生了什么。在调用函数然后调用解码时,我传递了一个指针。所以,它实际上是在将一个指针传递给解码调用。所以解决方法是改变解码调用:err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(&document)至err = collection.FindOne(context.TODO(), bson.M{"number": "12345"}).Decode(document)

元芳怎么了

在第一个示例中,文档的类型是interface. 如果您将参数类型固定如下,它将正常工作。func dbGetObject(collectionName string, document *Call)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go