【问题标题】:Sorting interface in GoGo中的排序界面
【发布时间】:2016-01-19 15:08:26
【问题描述】:

一直在谷歌搜索和堆砌解决方案,但没有成功。

我正在将一个 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,但是,当我打印它时,“红、绿、蓝”值会以随机顺序输出,如下所示:

[{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 值每次都以随机顺序出现。我想知道是否有办法始终以相同的顺序输出:红色、绿色、蓝色。

谢谢。

【问题讨论】:

  • 输出前排序..
  • 仅供参考,您可能需要稍微修改一下您的问题,因为您实际遇到的问题是如何显示数据。这里没有排序,也没有任何排序。如果您决定按 RGB 值的总和降序对 MainGradient 数组进行排序,那将是一种排序。据我所知,您只想将内存中的数据格式化为不同的格式。如果不是这种情况,请提供更正,但地图和结构(这是在 RGB 对象中容纳数据的唯一两个选项)都没有任何顺序概念。

标签: json go interface marshalling unmarshalling


【解决方案1】:

在 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,它完成了我需要做的事情。 Playground 示例非常适合我的需求。再次感谢。 :)
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2018-04-07
    • 2022-11-01
    • 2016-09-26
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多