首頁 > 後端開發 > Golang > 如何以插入順序迭代 Go Map?

如何以插入順序迭代 Go Map?

Barbara Streisand
發布: 2024-12-27 07:35:09
原創
726 人瀏覽過

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

按插入順序迭代映射

Go 映射不保證迭代順序,這使得按照插入順序檢索映射項目變得困難。要解決此問題,請考慮以下方法:

使用鍵切片

維護一個單獨的切片以按插入順序追蹤鍵。每當您向映射新增鍵值對時,請檢查該鍵是否存在於切片中。如果沒有,請添加。迭代地圖時,使用鍵切片來存取專案。

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])
    }
}
登入後複製

使用連結清單值包裝器

使用下列資料結構包裝地圖值:依插入順序儲存值並指向下一個鍵的指標。每當新增鍵值對時,就會更新前一個值包裝器的下一個指標。若要按插入順序進行迭代,請從第一個鍵開始並遵循下一個指標。

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
    }
}
登入後複製

這些解決方案解決了維護插入順序的需求,同時保留了地圖的優點。透過將關鍵追蹤與地圖操作分開,或按順序連結值,您可以可靠地按所需順序迭代地圖。

以上是如何以插入順序迭代 Go Map?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板