如何处理Firestore的DataTo方法中的嵌套指针?

问题描述 投票:0回答:1

我有以下结构:

type Address struct {
    Line1 string `firestore:"line1"`
    City  string `firestore:"city"`
}
type User struct {
    Name     string   `firestore:"name,required"`
    Email    string   `firestore:"email,required"`
    Password string   `firestore:"password,required"`
    Address  *Address `firestore:"address"`
    Age      int      `firestore:"age,required"`
}

当我将用户文档添加到 Firestore 时,一切正常:

docRef, _, err := client.Collection("users").Add(ctx, User{
    Name: "John",
    Email: "[email protected]",
    Password: "123456",
    Address: &Address{
        Line1: "1 Main Road",
        City: "NY",
    },
    Age: 18,
})
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println(docRef.ID)
}

问题是,当我尝试使用查询获取多个用户,然后使用

DataTo
方法将它们转换为 User 结构时,地址字段对于所有用户来说似乎都是相同的 - 即使用了相同的指针对于所有用户...

var user User
var users []Users
iter := query.Documents(ctx)

for {
    docSnap, err := iter.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        fmt.Println(err)
    }

    err = docSnap.DataTo(&user)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(user)
    users = append(users, user)
}

fmt.Println(docs)

我做错了什么吗?

我知道如果我不使用地址指针,这不是问题,但由于某些用户可能有一个零地址,我发现在这种情况下使用指针是有益的。这是一个错误,还是它应该如何工作?

firebase go google-cloud-firestore
1个回答
0
投票

第一次调用

 docSnap.DataTo(&user)
user.Address
设置为新分配的
Address
。对
DataTo
的后续调用将重用该
Address
。通过在 for 循环范围内声明
user
来修复此问题和其他潜在问题。

var users []Users
iter := query.Documents(ctx)

for {
    docSnap, err := iter.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        fmt.Println(err)
    }

    var user User // <-- declare user here
    err = docSnap.DataTo(&user)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(user)
    users = append(users, user)
}
© www.soinside.com 2019 - 2024. All rights reserved.