web-dev-qa-db-fra.com

Comment mettre à jour les valeurs de carte dans Go

Je veux construire une carte avec une clé de chaîne et une valeur de structure avec laquelle je suis capable de mettre à jour la valeur de structure dans la carte identifiée par la clé de carte.

J'ai essayé this et this ce qui ne me donne pas la sortie souhaitée.

Ce que je veux vraiment, c'est ceci:

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
16
Mehulkumar

Vous ne pouvez pas modifier les valeurs associées aux clés dans une carte, vous pouvez uniquement réaffecter des valeurs.

Cela vous laisse 2 possibilités:

  1. Stockez des pointeurs dans la carte, afin de pouvoir modifier l'objet pointé (qui ne se trouve pas dans la structure des données de la carte).

  2. Stockez les valeurs de struct, mais lorsque vous le modifiez, vous devez le réaffecter à la clé.

1. Utilisation de pointeurs

Stockage de pointeurs sur la carte: dataManaged := map[string]*Data{}

Lorsque vous "remplissez" la carte, vous ne pouvez pas utiliser la variable de la boucle, car elle est remplacée à chaque itération. Faites-en plutôt une copie et stockez l'adresse de cette copie:

for _, v := range dataReceived {
    fmt.Println("Received ID:", v.ID, "Value:", v.Value)
    v2 := v
    dataManaged[v.ID] = &v2
}

La sortie est comme prévu. Essayez-le sur le Go Playground .

2. Réaffectation de la structure modifiée

Rester sur le stockage des valeurs de struct dans la carte: dataManaged := map[string]Data{}

L'itération sur les paires clé-valeur vous donnera des copies des valeurs. Donc, après avoir modifié la valeur, réaffectez-la:

for m, n := range dataManaged {
    n.Value = "UpdatedData for " + n.ID
    dataManaged[m] = n
    fmt.Println("Data key:", m, "Value:", n.Value)
}

Essayez celui-ci sur le Go Playground .

21
icza