一尘不染

如何在Go中更新地图值

go

我想用字符串键和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

阅读 175

收藏
2020-07-02

共1个答案

一尘不染

您无法更改与地图中的键关联的值,只能重新分配值。

这给您2种可能性:

  1. 将指针存储在地图中,因此您可以修改 指向的 对象(不在地图数据结构内部)。

  2. 存储结构值,但是在修改它时,需要将其重新分配给键。

1.使用指针

在地图中存储指针: 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上尝试一下。

2.重新分配修改后的结构

坚持在地图中存储结构值: 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上尝试一下。

2020-07-02