为了账号安全,请及时绑定邮箱和手机立即绑定

在循环中向地图添加条目

在循环中向地图添加条目

Go
慕森王 2022-01-10 11:02:41
我正在尝试在我的应用程序中实现一种将每个国家/地区的用户分开的方法,然后将它们发送到不同的操作。这就是我现在所拥有的:var manyUsers zendesk.ManyUsersusers := 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 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

您基本上在循环的每次迭代中修改相同的变量manyUsers,for并在每次创建新映射条目时使用该单个实例作为值。


您没有向我们展示您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])

}

一个显而易见的效果演示就在那里——观察到第一个循环的迭代修改了相同的变量,而在第二个循环中,每个迭代首先获得一个新的变量实例。


查看完整回答
反对 回复 2022-01-10
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

manyUsers 的类型是 value 而不是 reference,所以下面的代码可能没问题


var manyUsers *zendesk.ManyUsers

users := make(map[string]*zendesk.ManyUsers)

......


查看完整回答
反对 回复 2022-01-10
?
白衣非少年

TA贡献1155条经验 获得超0个赞


我弄清楚我需要做什么,我使用了@kostix 的建议,所以我在for循环的每次迭代中创建,var manyUsers zendesk.ManyUsers但我还添加了以下内容:


manyUsers = users[country]

manyUsers.AppendUsers(mysqlRequest(country, id))

users[country] = manyUsers

将每个国家/地区的当前值传递给我的manyUsers我能够User在ManyUsers结构中添加一个新元素并将附加值返回给users[country]. 因此,我从不汇总迭代中的数据,并且每个国家/地区都获得了正确数量的用户。


谢谢你。


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信