猿问

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


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


谢谢你。


叮当猫咪
浏览 179回答 2
2回答

慕的地8271018

地图是无序的,无论是在 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

慕无忌1623718

虽然我个人会采用上面 JimB 描述的路线,但另一种选择只是改变您显示数据的方式。我可以根据您的输出推断出您所做的;fmt.Printf("%v", YourInstance). 如果您使用格式字符串明确指定每个项目的位置,则地图中项目的顺序无关紧要;fmt.Printf("red: %v, green: %v, blue: %v\n", ColorInstance["red"], ColorInstance["green"], ColorInstance["blue"])现在只打印一个实例,因此要打印整个内容,您需要进一步的逻辑,但这是基本思想。如果您希望事情井然有序,那么地图不是适合您的结构。如果您想基于密钥快速访问,那么地图是一个不错的选择。如果您只想格式化输出以写入控制台或文件或其他任何内容,可以使用地图轻松完成,但我个人认为,JimB 的建议是进行反序列化和处理此类数据的最佳方法。我的理念是使结构尽可能具体。您可以先完成工作,然后获得更清晰、更简洁、性能更好的代码。
随时随地看视频慕课网APP

相关分类

Go
我要回答