如何在Go中更新地图值

Meh*_*mar 12 struct dictionary go data-structures

我想用字符串键和结构值构建一个映射,我可以使用它来更新map key标识的map中的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
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 24

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

这为您提供了两种可能的选择:

  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
}
Run Code Online (Sandbox Code Playgroud)

输出符合预期.在Go Playground尝试一下.

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

坚持在地图中存储struct值: 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)
}
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试这个.