我有以下结构:
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)
我做错了什么吗?
我知道如果我不使用地址指针,这不是问题,但由于某些用户可能有一个零地址,我发现在这种情况下使用指针是有益的。这是一个错误,还是它应该如何工作?
第一次调用
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)
}