for-loop - 在循环中将条目添加到 map

标签 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 个不同的 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/

相关文章:

python - 如何忽略 Python 对象中未定义的属性?

python - 合并附加到字典中类似键的值

go - dgrijalva/jwt-go 可以将声明转换到 MapClaims 而不是 StandardClaims?

mysql - 我如何扫描一个值变成空而不处理它?

php - 我的循环显示结果值时遇到问题

在 C 中使用嵌套循环将 for() 循环转换为 do{}while

arrays - 在 C 中迭代结构体数组

用于快速创建和填充新测试文件的 BASH shell 脚本

c# - Dictionary<X, Func<Y>> 从其中的 Func<> 访问包含的 Dictionary

go - 在 gomail v2 中发送带有可选附件的电子邮件