我正在尝试在我的应用程序中实现一种方法来分隔每个国家/地区的用户,然后将其发送给不同的操作。
这就是我现在所拥有的:
var manyUsers zendesk.ManyUsers
users := make(map[string]zendesk.ManyUsers)
for {
...
manyUsers.AppendUsers(mysqlRequest(country, id))
users[country] = manyUsers
fmt.Printf("[%s]: %#v\n\n", country, users[country])
}
但我发现,当我添加3个不同的国家/地区后,它会产生3个不同的密钥,但最后一个密钥会有来自其他国家/地区的3个用户。
这是我的AppendUsers功能
func (users *ManyUsers) AppendUsers(user User) []User {
users.Users = append(users.Users, user)
return users.Users
}
答案 0 :(得分:1)
您基本上在manyUsers
循环的每次迭代中修改相同的变量for
,并在每次创建新映射条目时将该单个实例用作值。 / p>
您没有向我们展示您的zendesk.ManyUser
是如何定义的,但如果它具有参考语义,则所有地图条目都将共享相同的数据。
我的猜测(假设问题陈述不完整)是你需要在循环的每次迭代中创建一个zendesk.ManyUser
的新实例:
users := make(map[string]zendesk.ManyUsers)
for {
...
var manyUsers zendesk.ManyUsers
manyUsers.AppendUsers(mysqlRequest(country, id))
users[country] = manyUsers
fmt.Printf("[%s]: %#v\n\n", country, users[country])
}
效果is there的简单演示 - 观察第一个循环的迭代修改同一个变量,而在第二个循环中,每个迭代首先得到变量的新实例。
答案 1 :(得分:0)
manyUsers的类型值不是引用,所以下面的代码可能没问题
var manyUsers *zendesk.ManyUsers
users := make(map[string]*zendesk.ManyUsers)
......
答案 2 :(得分:0)
我要感谢@kostix和@cloudaice的答案。
我弄清楚我需要做什么,我使用了@kostix建议的内容,所以我在for
循环的每次迭代中创建了var manyUsers zendesk.ManyUsers
,但我还添加了以下内容:
manyUsers = users[country]
manyUsers.AppendUsers(mysqlRequest(country, id))
users[country] = manyUsers
将每个国家/地区的当前值传递给manyUsers
我能够在User
结构中添加新的ManyUsers
元素,并将附加值返回给users[country]
。因此,我从不聚合来自迭代的数据,每个国家都获得了正确数量的用户。
谢谢。