映射数组的追加 raplace 将所有以前的数组项放在最新的数组项上



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

我想创建一个这样的地图数组:

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

maps 变量是指向映射的指针,因此假设您的行映射位于内存地址0x50,那么您的值数组将是这样的

values := {{0x50}, {0x50}}

因此,两者都将通过更改行来更改。一个简单的方法是在第一次打印LNN后再次重复制作行或更改第二个映射的名称

发布问题后一分钟...

看起来追加不会复制地图,只是插入相同的地图。因此,每次我需要附加地图时重新创建地图都会有所帮助:

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

最新更新