Go中的排序接口

Sorting interface in Go

一直在谷歌搜索并四处寻找解决方案,但没有成功。

我正在将 JSON 文件导入结构,但是,当我想使用它时,值以随机顺序出现。这是我的 JSON 文件的示例:

"Assets": {
    "asset1": "asset1.png",
    "asset2": "asset2.png"
  },
  "Colors": {
    "MainColor": [
      {
        "red": 247,
        "green": 0,
        "blue": 247
      }
    ],
    "MainGradient": [
      {
        "red": 9,
        "green": 103,
        "blue": 170
      },
      {
        "red": 18,
        "green": 138,
        "blue": 221
      }
    ]
}

我可以使用 Unmarshal 导入 JSON,但是,当我打印它时,"red, green,blue" 值以随机顺序输出,如下所示:

[{map[asset1:asset1.png asset2:asset2.png] {[map[red:247 green:0 blue:247]] [map[green:103 red:9 blue:170] map[green:138 blue:221 red:18]]}}]

如您所见,RGB 值每次都是随机排列的。我想知道是否有办法始终以相同的顺序输出:红色、绿色、蓝色。

谢谢。

Go 和 JSON 规范中的映射都是无序的。您必须在需要时按顺序调用它们。

r, g, b := color["red"], color["green"], color["blue"]

您还可以将值解组为结构,这将为您提供确定性布局:

type Color struct {
    Red   int `json:"red"`
    Green int `json:"green"`
    Blue  int `json:"blue"`
}

http://play.golang.org/p/0l01NxJ4dq

虽然我个人会采用 JimB 上面描述的路线,但另一个选项只是更改显示数据的方式。我可以根据您的输出推断您所做的; fmt.Printf("%v", YourInstance)。如果您明确指定每个项目的位置以及格式字符串,则地图中项目的顺序无关紧要;

fmt.Printf("red: %v, green: %v, blue: %v\n", ColorInstance["red"], ColorInstance["green"], ColorInstance["blue"])

现在只打印一个实例,因此要打印整个内容,您需要进一步的逻辑,但这是基本思想。

如果您希望事情井井有条,地图不适合您。如果你想基于一个键快速访问,那么地图是一个不错的选择。如果您只想格式化输出以写入控制台或文件或其他内容,可以使用地图轻松完成,但我个人认为,JimB 的建议是处理反序列化和处理此类数据的最佳方法。我的理念是使结构尽可能具体。您可以提前完成工作,然后获得更简洁、更简洁、性能更好的代码。