我想用字符串键和struct值构建一个映射,通过它我可以更新由map key标识的映射中的struct值。
我已经尝试过了,这并没有给我想要的输出。
我真正想要的是:
Received ID: D1 Value: V1 Received ID: D2 Value: V2 Received ID: D3 Value: V3 Received ID: D4 Value: V4 Received ID: D5 Value: V5 Data key: D1 Value: UpdatedData for D1 Data key: D2 Value: UpdatedData for D2 Data key: D3 Value: UpdatedData for D3 Data key: D4 Value: UpdatedData for D4 Data key: D5 Value: UpdatedData for D5 Data key: D1 Value: UpdatedData for D1 Data key: D2 Value: UpdatedData for D2 Data key: D3 Value: UpdatedData for D3 Data key: D4 Value: UpdatedData for D4 Data key: D5 Value: UpdatedData for D5
您无法更改与地图中的键关联的值,只能重新分配值。
这给您2种可能性:
将指针存储在地图中,因此您可以修改 指向的 对象(不在地图数据结构内部)。
存储结构值,但是在修改它时,需要将其重新分配给键。
在地图中存储指针: dataManaged := map[string]*Data{}
dataManaged := map[string]*Data{}
当您“填充”地图时,您无法使用循环的变量,因为它在每次迭代中都会被覆盖。而是制作一个副本,并存储该副本的地址:
for _, v := range dataReceived { fmt.Println("Received ID:", v.ID, "Value:", v.Value) v2 := v dataManaged[v.ID] = &v2 }
输出是预期的。在Go Playground上尝试一下。
坚持在地图中存储结构值: dataManaged := map[string]Data{}
dataManaged := map[string]Data{}
遍历键值对将为您提供值的副本。因此,在修改值之后,请重新分配它:
for m, n := range dataManaged { n.Value = "UpdatedData for " + n.ID dataManaged[m] = n fmt.Println("Data key:", m, "Value:", n.Value) }
在Go Playground上尝试一下。