【问题标题】:Adding entries to a map in a loop在循环中向地图添加条目
【发布时间】:2026-01-14 19:30:01
【问题描述】:

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

这就是我现在拥有的:

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
}

【问题讨论】:

    标签: for-loop dictionary go


    【解决方案1】:

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

    您没有向我们展示您的 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 效果的简单演示 - 观察第一个循环的迭代修改相同的变量,而在第二个循环中,每个迭代首先获得一个新的变量实例。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        感谢@kostix 和@cloudaice 的解答。

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

        manyUsers = users[country]
        manyUsers.AppendUsers(mysqlRequest(country, id))
        users[country] = manyUsers
        

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

        谢谢。

        【讨论】:

        • 然后考虑接受你自己的答案——这就是 SO 规则建议做的事情。
        最近更新 更多