使用 Go 保留 YAML 映射的顺序

Posted

技术标签:

【中文标题】使用 Go 保留 YAML 映射的顺序【英文标题】:Preserving order of YAML maps using Go 【发布时间】:2016-02-11 21:04:40 【问题描述】:

我试图弄清楚如何在 Go 中读取 YAML 文件,同时保留 YAML 文档中的键顺序。我见过的大多数示例都涉及对键进行排序,但这在我的情况下不起作用。此外,YAML 是任意结构的(键是用户定义的,值是字符串和字符串列表的混合,也是用户定义的),这使事情变得复杂。

go-yaml.v2 似乎可以满足我的要求 (http://blog.labix.org/2014/09/22/announcing-yaml-v2-for-go),但我找不到任何有关如何使用排序功能的示例。这一点,加上对 Go 完全陌生,让我很困惑。

如果需要,我很乐意提供我尝试解析的 YAML 示例。

【问题讨论】:

只需使用该包中的MapSlice 类型,而不是您反序列化到的数据结构中的map 【参考方案1】:

给你:

var data = `
  a: Easy!
  b:
  c: 2
  d: [3, 4]
`
m := yaml.MapSlice
err := yaml.Unmarshal([]byte(data), &m)
if err != nil 
    log.Fatalf("error: %v", err)

fmt.Printf("--- m:\n%v\n\n", m)

【讨论】:

很好的例子——但在大多数情况下我们知道under类型。所以我想保持map[string]*MyType 的顺序有没有简单的解决方案? @hobbs

以上是关于使用 Go 保留 YAML 映射的顺序的主要内容,如果未能解决你的问题,请参考以下文章

保留插入顺序的不可变 Scala Map 实现

使用 YAML::XS 控制 hashref 的顺序

LinkedHashMap概述

理解LinkedHashMap

yaml-cpp 以啥顺序返回数据?

SpringBoot 中属性文件、YAML 文件和命令行参数之间的优先顺序