Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 使用append向slice添加一个新值,slice的所有值都将更改_Go - Fatal编程技术网

Go 使用append向slice添加一个新值,slice的所有值都将更改

Go 使用append向slice添加一个新值,slice的所有值都将更改,go,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["i

下面显示的代码:

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]]
结果是:

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]]
预期结果为:

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]]

为什么?

之所以发生这种情况,是因为每次迭代都要更改
区域[“id”]
区域[“value”]
的值-最后一次是“id”为3,而“value”为c。存储在
data
中的每个
map[string]接口{}
都指向内存中的同一对象

您可以使用复合文字来实现所需的结果

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

操场上的来源:

您只创建一个区域地图,并且每次都将其放入数组中,相反,您需要为每次迭代创建一个新地图,例如

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]]

请正确设置代码格式,并用四个空格缩进。