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

如何以特定順序迭代 Go Map?

Mary-Kate Olsen
發布: 2024-12-26 08:15:09
原創
713 人瀏覽過

How Can I Iterate Through a Go Map in a Specific Order?

Go 地圖的有序迭代:綜合指南

由於語言的仕様,按順序迭代Go 地圖可能是一個挑戰,它強調並發而不是順序保存。本文將探討兩種實現有序迭代的可靠方法,同時保持使用映射的優勢。

1.使用鍵切片維護順序

此方法涉及在單獨的切片中追蹤映射鍵以確保迭代的順序。雖然引入了開銷,但這種方法提供了簡單和清晰的實作。

  • 密鑰包裝:對於插入到映射中的每個密鑰,檢查它是否存在於密鑰切片中。如果沒有,則將鍵添加到切片中。
  • 切片用法:在迭代過程中,使用鍵切片存取映射中對應的值。
  • 保持同步: 當從切片中刪除對應的值時,從切片中刪除鍵地圖。

範例實作:

type Key int   // Key type
type Value int // Value type

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

func New() *Map {
    return &Map{m: make(map[Key]Value)}
}

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

2.在LinkedList 中連結值

2.在LinkedList 中連結值

  • 此方法涉及將值包裝在包含實際值和對下一個鍵的參考的結構中。它允許高效地插入和刪除元素。
  • 值包裝器:使用值和對下一個鍵的引用定義一個值包裝器結構。
  • 映射插入: 將值包裝器設定為中鍵的值map.
  • 連結機制:將新包裝器連結到前一個包裝器以保持插入順序。
迭代:

從第一個鍵開始迭代並按照下面的參考文獻按插入順序存取值。

type Key int   // Key type
type Value int // Value type

type valueWrapper struct {
    value Value
    next  *Key // Next key
}

type Map struct {
    m           map[Key]valueWrapper
    first, last *Key
}

func New() *Map {
    return &Map{m: make(map[Key]valueWrapper)}
}

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.value, &k}
    }
    w := valueWrapper{value: 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.value)
        k = w.next
    }
}
登入後複製
實施例:

獎勵:

  • 以下是其他一些需要考慮的提示:
  • 地圖實作:考慮建立一個自訂類型來包裝地圖並提供有序的必要方法迭代。
最佳化:始終探索最佳化以減少開銷並提高效能。

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

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