在循环中向地图添加条目

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


这就是我现在所拥有的:


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

}


慕森王
浏览 134回答 3
3回答

动漫人物

您基本上在循环的每次迭代中修改相同的变量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])}一个显而易见的效果演示就在那里——观察到第一个循环的迭代修改了相同的变量,而在第二个循环中,每个迭代首先获得一个新的变量实例。

尚方宝剑之说

manyUsers 的类型是 value 而不是 reference,所以下面的代码可能没问题var manyUsers *zendesk.ManyUsersusers := make(map[string]*zendesk.ManyUsers)......

白衣非少年

我弄清楚我需要做什么,我使用了@kostix 的建议,所以我在for循环的每次迭代中创建,var manyUsers zendesk.ManyUsers但我还添加了以下内容:manyUsers = users[country]manyUsers.AppendUsers(mysqlRequest(country, id))users[country] = manyUsers将每个国家/地区的当前值传递给我的manyUsers我能够User在ManyUsers结构中添加一个新元素并将附加值返回给users[country]. 因此,我从不汇总迭代中的数据,并且每个国家/地区都获得了正确数量的用户。谢谢你。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go