【发布时间】:2016-03-27 18:15:29
【问题描述】:
我正在使用Go-Yaml 将一些映射序列化为 YAML。有没有办法确保序列化的 YAML 是按照它们插入 Go Map 的顺序使用键编写的?还是需要自己重新实现 Marshal 接口?
【问题讨论】:
-
Go 中的地图没有定义的顺序。事实上,它在迭代时是显式随机化的:blog.golang.org/go-maps-in-action#TOC_7.
-
改用 github.com/kylelemons/go-gypsy/yaml。
-
@hasanyasin 看起来它会有同样的问题,因为它的 Map 在内部表示为
map[string]Node。 -
这不是一个记录的特性,只是实现的结果,但看起来如果你使用
struct,输出当前是按照声明字段的顺序。 Here's code--自然不会在(无库的)游乐场环境中工作。如果您预先知道您的字段,因此您可以将它们放在struct中,并且您只关心出于美学原因的排序(即,如果您升级 go-yaml 并且排序更改,您的系统不会崩溃),也许现在就够了。 -
@twotwotwo 抱歉没有具体说明。我使用 ReadFile 而不是 Parse,然后在树上行走。这比在没有任何控制权的情况下将所有文档刷新到 Go 中要好得多。