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

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

Barbara Streisand
Libérer: 2024-12-27 07:35:09
original
725 Les gens l'ont consulté

How Can I Iterate Over a Go Map in Insertion Order?

Itération des cartes dans l'ordre d'insertion

Les cartes Go ne garantissent pas l'ordre des itérations, ce qui rend difficile la récupération des éléments de la carte dans l'ordre dans lequel ils ont été insérés . Pour résoudre ce problème, envisagez les approches suivantes :

Utilisation d'une tranche de clés

Gérez une tranche distincte pour suivre les clés dans l'ordre d'insertion. Chaque fois que vous ajoutez une paire clé-valeur à la carte, vérifiez si la clé existe dans la tranche. Sinon, ajoutez-le. Lorsque vous parcourez la carte, utilisez la tranche de touches pour accéder aux éléments.

type Map struct {
    m map[Key]Value
    keys []Key
}

func (m *Map) Set(k Key, v Value) {
    if _, ok := m.m[k]; !ok {
        m.keys = append(m.keys, k)
    }
    m.m[k] = v
}

func (m *Map) Range() {
    for _, k := range m.keys {
        fmt.Println(m.m[k])
    }
}
Copier après la connexion

Utilisation d'un wrapper de valeurs de liste chaînée

Enveloppez les valeurs de la carte avec une structure de données qui stocke la valeur et un pointeur vers la clé suivante dans l’ordre d’insertion. Chaque fois que vous ajoutez une paire clé-valeur, mettez à jour le pointeur suivant du wrapper de valeur précédent. Pour itérer dans l'ordre d'insertion, commencez par la première clé et suivez les pointeurs suivants.

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 _, ok := m.m[k]; !ok && m.last != nil {
        w2 := m.m[*m.last]
        m.m[*m.last] = valueWrapper{w2.v, &k}
    }
    w := valueWrapper{v: v}
    m.m[k] = w
    if m.first == nil {
        m.first = &k
    }
    m.last = &k
}

func (m *Map) Range() {
    for k := m.first; k != nil; {
        w := m.m[*k]
        fmt.Println(w.v)
        k = w.next
    }
}
Copier après la connexion

Ces solutions répondent à la nécessité de maintenir l'ordre d'insertion tout en préservant les avantages de la carte. En séparant le suivi des touches des opérations sur la carte ou en liant les valeurs dans l'ordre, vous pouvez parcourir les cartes de manière fiable dans l'ordre souhaité.

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