按插入顺序迭代映射
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中文网其他相关文章!