首页 >后端开发 >Golang >如何按插入顺序迭代 Go Map?

如何按插入顺序迭代 Go Map?

Barbara Streisand
Barbara Streisand原创
2024-12-27 07:35:09740浏览

How Can I Iterate Over a Go Map in Insertion Order?

按插入顺序迭代映射

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn