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 中連結值
從第一個鍵開始迭代並按照下面的參考文獻按插入順序存取值。
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中文網其他相關文章!