使用append为切片添加新值,并更改切片的所有值

时间:2018-03-10 14:48:37

标签: go

代码如下所示:

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)
}

结果是:

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

预期结果是:

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

为什么?

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您每次迭代都会更改area["id"]area["value"]的值 - 最后一次是" id" 3,和"值" c。存储在map[string]interface{}中的每个data都指向内存中的同一个对象。

您可以使用复合文字来获得所需的结果。

package main

import (
    "fmt"
)

func main() {
    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, map[string]interface{}{"id": value["id"], "value": value["value"]})
    }

    fmt.Println("data:", data)
}

操场上的来源:https://play.golang.org/p/kU4eHowh8N2

答案 1 :(得分:0)

您只创建一个区域地图,并且每次都将它放在数组中,而是需要为每次迭代创建一个新的地图,例如

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

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

for _, value := range maps_temp {
    area := make(map[string]interface{})
    area["id"] = value["id"]
    area["value"] = value["value"]

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

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