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 D5Run Code Online (Sandbox Code Playgroud)
icz*_*cza 24
您无法更改与地图中的键关联的值,您只能重新分配值.
这为您提供了两种可能的选择:
将指针存储在地图中,以便修改指向的对象(不在地图数据结构中).
存储结构值,但在修改它时,需要将其重新分配给键.
在地图中存储指针: 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尝试一下.
坚持在地图中存储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尝试这个.