在循环中向条目添加条目

时间:2016-05-06 16:00:02

标签: for-loop dictionary go

我正在尝试在我的应用程序中实现一种方法来分隔每个国家/地区的用户,然后将其发送给不同的操作。

这就是我现在所拥有的:

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
}

3 个答案:

答案 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] 。因此,我从不聚合来自迭代的数据,每个国家都获得了正确数量的用户。

谢谢。