我正在尝试在我的应用程序中实现一种方法来区分每个国家/地区的用户,然后将他们发送到不同的操作。
这是我现在拥有的:
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 个不同的 key ,但最后一个将有来自其他国家的 3 个用户。
这是我的 AppendUsers 函数
func (users *ManyUsers) AppendUsers(user User) []User {
users.Users = append(users.Users, user)
return users.Users
}
最佳答案
您实际上是在for
循环的每次迭代中修改相同 变量manyUsers
,并在每次创建时使用该单个实例作为值新的 map 条目。
您没有向我们展示您的 zendesk.ManyUser
是如何定义的,但如果它具有引用语义,您的所有 map 条目将共享相同的数据。
我的猜测(考虑到不完整的问题陈述)是您需要在循环的每次迭代中创建一个新的 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 — 观察第一个循环的迭代修改同一个变量,而在第二个循环中,每个迭代首先获得一个变量的新实例。
关于for-loop - 在循环中将条目添加到 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37076773/