Création d'une carte associative dans Go : comment copier en profondeur et effacer l'original
Dans Go, vous essayez de copier le contenu d'une carte appelée aMap dans une autre carte nommée aSuperMap. Par la suite, vous souhaitez effacer aMap pour accepter de nouvelles valeurs lors de la prochaine itération de boucle. Cependant, vous êtes confronté au problème d'effacer la carte sans également effacer sa référence dans aSuperMap.
Le problème avec les références
Votre pseudo-code illustre que lorsque vous supprimez un élément d'aMap à l'aide de delete(aMap, x), la référence à cet élément est également supprimée d'aSuperMap. En effet, aSuperMap[y] contient une référence à aMap et lorsque vous modifiez aMap (dans ce cas, en supprimant un élément), vous modifiez en fait les données sous-jacentes vers lesquelles pointe aSuperMap.
Copie approfondie de cartes
Pour véritablement créer une carte associative dans Go, vous devez effectuer une copie approfondie de la carte. Cela implique de créer un nouvel objet cartographique avec sa propre copie des données, plutôt que de simplement conserver une référence à la carte originale.
Vous pouvez y parvenir en créant manuellement une boucle for qui parcourt la carte originale et ajoute chaque paire clé-valeur à la nouvelle carte :
for k, v := range originalMap { newMap[k] = v }
En faisant cela, vous créez une nouvelle carte qui contient les mêmes données que la carte d'origine, mais les deux cartes sont des objets distincts avec leurs propres copies de le data.
Effacer la carte originale
Une fois que vous avez une copie complète de la carte, vous pouvez effacer la carte originale sans affecter la nouvelle carte. Pour ce faire, vous pouvez utiliser la fonction de réinitialisation du package conteneur/list :
for something := range fruits { aMap := make(map[string]aStruct) aSuperMap := make(map[string]map[string]aStruct) for x := range something { aMap[x] = aData aSuperMap[y] = aMap delete(aMap, x) } // Deep copy aMap into newMap newMap := make(map[string]aStruct) for k, v := range aMap { newMap[k] = v } // Clear the original aMap container/list.Reset(aMap) // Save the new map saveASuperMap(newMap) }
En suivant ces étapes, vous pouvez réussir à créer une carte associative dans Go, effectuer une copie complète de la carte pour préserver les données d'origine et effacez la carte d'origine pour accepter de nouvelles valeurs dans la prochaine itération de boucle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!