这个问题听起来可能很愚蠢,但我真的不明白出了什么问题。
我想创建一个这样的地图数组:
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)
}