Arrays 为地图数组追加将以前的所有数组项放在最新的数组项上

Arrays 为地图数组追加将以前的所有数组项放在最新的数组项上,arrays,go,append,Arrays,Go,Append,这个问题听起来很愚蠢,但我真的不明白出了什么问题 我想创建一组地图,如下所示: values := make([]map[string]string, 0) 然后我创建一些地图: row := make(map[string]string) row["item1"] = "value1" row["item2"] = "value2" 然后将其附加到数组中: values = append(values, row) 打印值现在提供: [map[item1:value1 item2:valu

这个问题听起来很愚蠢,但我真的不明白出了什么问题

我想创建一组地图,如下所示:

values := make([]map[string]string, 0)
然后我创建一些地图:

row := make(map[string]string)
row["item1"] = "value1"
row["item2"] = "value2"
然后将其附加到数组中:

values = append(values, row)
打印值现在提供:

[map[item1:value1 item2:value2]]
使用其他一些值执行相同操作:

row["item1"] = "value3"
row["item2"] = "value4"
values = append(values, row)
现在,打印值可以提供:

[map[item1:value3 item2:value4] map[item1:value3 item2:value4]]
因此,第一个数组项=第二个数组项。 这是什么原因造成的

完整代码:

package main

import "fmt"

func main() {
  values := make([]map[string]string, 0)
  row := make(map[string]string)
  row["item1"] = "value1"
  row["item2"] = "value2"
  values = append(values, row)
  fmt.Println(values)
  row["item1"] = "value3"
  row["item2"] = "value4"
  values = append(values, row)
  fmt.Println(values)
}

在发布问题后一分钟内

看起来append没有复制映射,只是插入了相同的。。因此,每次需要附加地图时,重新创建地图有助于:

package main


import "fmt"

func main() {
  values := make([]map[string]string, 0)
  row := make(map[string]string)
  row["item1"] = "value1"
  row["item2"] = "value2"
  values = append(values, row)
  fmt.Println(values)
  row2 := make(map[string]string)
  row2["item1"] = "value3"
  row2["item2"] = "value4"
  values = append(values, row2)
  fmt.Println(values)
}

maps变量是指向映射的指针,所以假设行映射位于0x50内存地址中,那么值数组如下所示

values := {{0x50}, {0x50}}
因此,通过改变行,两者都会改变。
一个简单的方法是,在第一次println之后重复制作行,或者更改第二个map的名称,这不是一个数组,而是一个切片。不能附加到Go数组,因为它们的大小是其类型的一部分。