以插入順序迭代 Go Map
傳統觀點認為 Go Map 的迭代順序是不可預測且不穩定的。然而,實作順序保留需要利用獨立維護插入序列的替代資料結構:
1。追蹤單獨切片中的鍵:
透過按照插入順序維護鍵切片,您可以迭代這些鍵並從映射中檢索其對應的值。這消除了對重複資料的需求,並提供了可靠的迭代序列。
2.使用帶有連結清單的值包裝器:
另一種方法涉及使用包含對插入順序中下一個鍵的引用的結構來包裝映射中的每個值。這允許按預期順序遍歷元素,即使在刪除或插入之後也是如此。
比較:
兩種方法都保留了使用映射的優點,同時提供有序迭代。然而,使用單獨的鍵切片的方法具有更簡單的實現,但在刪除元素時可能會產生開銷。鍊錶方法提供了更快的刪除速度,但引入了更多的複雜性。
程式碼片段:
切片中的鍵:
type Map struct { m map[Key]Value keys []Key } func (m *Map) Set(k Key, v Value) { // ... m.keys = append(m.keys, 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 m.last != nil { w := m.m[*m.last] m.m[*m.last] = valueWrapper{w.v, &k} } // ... }
透過使用這些技術,您可以有效地迭代 Go 映射並按照最初插入的順序檢索項目。
以上是如何按照插入順序迭代Go Map?的詳細內容。更多資訊請關注PHP中文網其他相關文章!