Heim >Backend-Entwicklung >Golang >Wie kann ich eine Go-Map in der Einfügungsreihenfolge durchlaufen?

Wie kann ich eine Go-Map in der Einfügungsreihenfolge durchlaufen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-27 07:35:09727Durchsuche

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

Iterieren von Karten in der Einfügereihenfolge

Go-Maps garantieren keine Iterationsreihenfolge, was es schwierig macht, Kartenelemente in der Reihenfolge abzurufen, in der sie eingefügt wurden . Um dieses Problem zu lösen, sollten Sie die folgenden Ansätze in Betracht ziehen:

Verwenden eines Keys-Slice

Behalten Sie ein separates Slice bei, um Schlüssel in der Einfügereihenfolge zu verfolgen. Wenn Sie der Karte ein Schlüssel-Wert-Paar hinzufügen, prüfen Sie, ob der Schlüssel im Slice vorhanden ist. Wenn nicht, fügen Sie es hinzu. Wenn Sie über die Karte iterieren, verwenden Sie das Schlüssel-Slice, um auf Elemente zuzugreifen.

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])
    }
}

Verwenden eines Wert-Wrappers für verknüpfte Listen

Umschließen Sie Kartenwerte mit einer Datenstruktur, die speichert den Wert und einen Zeiger auf den nächsten Schlüssel in der Einfügereihenfolge. Wenn Sie ein Schlüssel-Wert-Paar hinzufügen, aktualisieren Sie den nächsten Zeiger des vorherigen Wert-Wrappers. Um in der Einfügereihenfolge zu iterieren, beginnen Sie mit dem ersten Schlüssel und folgen Sie den nächsten Hinweisen.

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
    }
}

Diese Lösungen erfüllen die Notwendigkeit, die Einfügereihenfolge beizubehalten und gleichzeitig die Vorteile der Karte zu bewahren. Indem Sie die Schlüsselverfolgung von Kartenvorgängen trennen oder Werte der Reihe nach verknüpfen, können Sie Karten zuverlässig in der gewünschten Reihenfolge durchlaufen.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Go-Map in der Einfügungsreihenfolge durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn