我有一个导航栏作为 map :

var navbar = map[string]navbarTab{
}

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

操场链接在这里:http://play.golang.org/p/nSL1zhadg5,尽管它似乎没有表现出相同的行为.

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

推荐答案

Go map 不保持插入顺序;您必须自己实现此行为.

示例:

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已在 map 中,则不会更新其插入顺序):

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

Select 最简单的东西来满足你的需求.

Go相关问答推荐

杜松子wine -戈尼克背景在 children 围棋例行公事中被取消

如何使用中间件更改http请求的响应代码?

由docker中的nginx提供的样式和图像在页面上不起作用

无法获取RPC描述符

Json.Unmarshal() 和 gin.BindJson() 之间的区别

无法在go中为docker容器写入有效的挂载路径

GORM中是否可能自动迁移具有循环关系的表?

杜松子wine 和中间件

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

无法从主域访问子域:无Access-Control-Allow-Origin

当客户端同时是服务器时,需要什么 mTLS 证书?

有没有办法计算枚举中定义的项目总数?

helm :将 YAML 转换为 JSON 时出错:yaml:第 xx 行:未找到预期的密钥

Go http.FileServer 给出意外的 404 错误

如何在 Golang 中使用具有相同名称或特定关键字的行或列重新排列/排序 CSV

gorm 获取列名

有没有办法在 golang 中定义可索引类型?

在 Go 中将十六进制转换为带符号的 Int

如何在 Go 中使用 Pact 返回错误请求(400、500)?

如何正确解组不同类型的数组?