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 中链接值
此方法涉及将值包装在包含实际值和对下一个键的引用的结构中。它允许高效地插入和删除元素。
示例实施:
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中文网其他相关文章!