Itérer une carte Go par ordre d'insertion
La sagesse conventionnelle suggère que l'ordre d'itération des cartes Go est imprévisible et instable. Cependant, pour parvenir à la préservation de l'ordre, il faut utiliser des structures de données alternatives qui maintiennent la séquence d'insertion de manière indépendante :
1. Suivi des clés dans une tranche séparée :
En conservant une tranche de clés dans l'ordre dans lequel elles ont été insérées, vous pouvez parcourir les clés et récupérer leurs valeurs correspondantes sur la carte. Cela élimine le besoin de données en double et fournit une séquence d'itérations fiable.
2. Utilisation d'un wrapper de valeur avec une liste chaînée :
Une autre approche consiste à envelopper chaque valeur de la carte avec une structure qui inclut une référence à la clé suivante dans l'ordre d'insertion. Cela permet de parcourir les éléments dans l'ordre prévu, même après des suppressions ou des insertions.
Comparaison :
Les deux méthodes conservent les avantages de l'utilisation de cartes tout en fournissant une itération ordonnée. . Cependant, l'approche avec une tranche séparée pour les clés a une implémentation plus simple mais peut entraîner une surcharge lors de la suppression d'éléments. L'approche de liste chaînée offre une suppression plus rapide mais introduit plus de complexité.
Extraits de code :
Clés dans une tranche :
type Map struct { m map[Key]Value keys []Key } func (m *Map) Set(k Key, v Value) { // ... m.keys = append(m.keys, k) // ... }
Wrapper de valeur avec lien Liste :
type valueWrapper struct { value Value next *Key } type Map struct { m map[Key]valueWrapper first, last *Key } func (m *Map) Set(k Key, v Value) { // ... if m.last != nil { w := m.m[*m.last] m.m[*m.last] = valueWrapper{w.v, &k} } // ... }
En employant ces techniques, vous pouvez parcourir efficacement une carte Go et récupérer les éléments dans l'ordre dans lequel ils ont été insérés à l'origine.
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!