使用append往slice中添加一个值的时候,slice中的所有值均被修改

jason_dong · 2018-03-10 23:17:27 · 1614 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-03-10 23:17:27 的主题,其中的信息可能已经有所发展或是发生改变。

var data = make([]map[string]interface{}, 0)

var area = make(map[string]interface{})

maps_temp := []map[string]interface{}{{"id":1, "value":"a"},{"id":2, "value":"b"},{"id":3, "value":"c"}}    

for _, value := range maps_temp {
    area["id"] = value["id"]
    area["value"] = value["value"]

    data = append(data, area)
}
fmt.Println("data:",data)

The result is

data: [map[id:3 value:c] map[id:3 value:c] map[id:3 value:c]]

expected result is :

data: [map[id:1 value:a] map[id:2 value:b] map[id:3 value:c]]

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1614 次点击  
加入收藏 微博
5 回复  |  直到 2018-03-13 16:56:50
bbjj040471
bbjj040471 · #1 · 7年之前

map 是指针 你的area

dong-hao
dong-hao · #2 · 7年之前

for loop 中,value 的变量被重复使用了,就是说,你三次

area["id"]
area["value"]

指向的都是同一片地址。

你在这里,可以这么修改:

for i, _ := range maps_temp {
    value := maps_temp[i]

    area["id"] = value["id"]
    area["value"] = value["value"]

    data = append(data, area)
}
dong-hao
dong-hao · #3 · 7年之前
dong-haodong-hao #2 回复

for loop 中,value 的变量被重复使用了,就是说,你三次 ``` area["id"] area["value"] ``` 指向的都是同一片地址。 你在这里,可以这么修改: ``` for i, _ := range maps_temp { value := maps_temp[i] area["id"] = value["id"] area["value"] = value["value"] data = append(data, area) } ```

抱歉,我没注意到楼主的语法错误,我刚才那样的修改是不对的。

 area["id"] = value["id"]
 area["value"] = value["value"]

楼主这两句,坑了自己。你这两句实际上就是给 area 这个 map 的两个 key ,即 "id" "value" 反复的赋值,从始至终,你的 area 这个 map 就这两个 key-value 对。楼主知道问题在哪里了么。。

修改的话,一定不能把 "id" 这个字符串作为你的 key,要把 value["id"] 作为你的 key,value["value"] 作为你的 value,这样才能保证连续取到三个 key-value pair.

for i, _ := range maps_temp {
        value := maps_temp[i]
        id := strconv.Itoa(value["id"].(int))
        v := value["value"]
        area[id] = v
    }
    data = append(data, area)
    fmt.Println("data:", data)
dong-hao
dong-hao · #4 · 7年之前

如果一定要按照楼主的思路写的话,可以这么修改:

for _, value := range maps_temp {
        area["id"] = value["id"]
        area["value"] = value["value"]

        data = append(data, area)
        area = make(map[string]interface{})
    }
    fmt.Println("data:", data)
jason_dong
jason_dong · #5 · 7年之前

@dong-hao 感谢,确实是指向的同一个地址,按照你的方法成功解决,非常感谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传