Maison > développement back-end > Golang > Comment puis-je parcourir une Go Map dans l'ordre d'insertion ?

Comment puis-je parcourir une Go Map dans l'ordre d'insertion ?

Barbara Streisand
Libérer: 2024-12-19 20:52:16
original
247 Les gens l'ont consulté

How Can I Iterate Through a Go Map in the Order of Insertion?

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)
    // ...
}
Copier après la connexion

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}
    }
    // ...
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal