一尘不染

为什么不能按插入顺序迭代地图?

go

我有一个导航栏作为地图:

var navbar = map[string]navbarTab{
}

其中navbarTab具有各种属性,子项等。当我尝试渲染导航栏(带有for tabKey := range navbar)时,它以随机顺序显示。我知道range它在运行时会随机排序,但是似乎无法获取有序的键列表或按插入顺序进行迭代。

游乐场链接位于此处:http :
//play.golang.org/p/nSL1zhadg5,尽管它似乎没有表现出相同的行为。

如何在不破坏插入顺序的情况下迭代此映射?


阅读 232

收藏
2020-07-02

共1个答案

一尘不染

Go地图不保持插入顺序;您将必须自己实现此行为。

例:

type NavigationMap struct {
    m map[string]navbarTab
    keys []string
}

func NewNavigationMap() *NavigationMap { ... }

func (n *NavigationMap) Set(k string, v navbarTab) {
    n.m[k] = v
    n.keys = append(n.keys, k)
}

本示例不完整,并且未涵盖所有用例(例如,更新重复键上的插入顺序)。

如果您的用例包括多次重新插入相同的键(如果键 k 已在映射中,则不会更新键 k的 插入顺序):

func (n *NavigationMap) Set(k string, v navbarTab) {
    _, present := n.m[k]
    n.m[k] = v
    if !present {
        n.keys = append(n.keys, k)
    }
}

选择满足您要求的最简单的方法。

2020-07-02