如何在golang中对数组进行排列以不随机化预定键?

时间:2019-01-23 06:50:22

标签: go beego

我目前的golang项目有麻烦。

我要去的另一个包中有一个带有预定键的数组,例如:

package updaters

var CustomSql map[string]string

func InitSqlUpdater() {
    CustomSql = map[string]string{
        "ShouldBeFirst": "Text Should Be First",
        "ShouldBeSecond": "Text Should Be Second",
        "ShouldBeThird": "Text Should Be Third",
        "ShouldBeFourth": "Text Should Be Fourth"
   }
}

并将其发送到main.go,以迭代每个索引和值,但是结果是随机的(在我的情况下,我需要按顺序进行操作)。

真实案例:https://play.golang.org/p/ONXEiAj-Q4v

我搜索了为什么golangs会以随机方式进行迭代,并且该示例使用了sort,但是我的数组键是预先确定的,并且sort仅针对asc desc字母和数字。

那么,我该如何实现数组不会在迭代中随机化的方式?

ShouldBeFirst = Text Should Be First
ShouldBeSecond = Text Should Be Second
ShouldBeThird = Text Should Be Third
ShouldBeFourth = Text Should Be Fourth

感谢任何人,谢谢。

1 个答案:

答案 0 :(得分:2)

language specification says

  

未指定地图上的迭代顺序,并且不能保证每次迭代之间都相同。

要以已知顺序遍历固定的一组键,请将这些键存储在切片中并遍历slice元素。

var orderdKeys = []string{
   "ShouldBeFirst", 
   "ShouldBeSecond",
   "ShouldBeThird",
   "ShouldBeFourth",
}

for _, k := range orderdKeys {
    fmt.Println(k+" = "+CustomSql[k])
}

另一种选择是使用值的切片:

 type nameSQL struct {
   name string
   sql string
}

CustomSql := []nameSQL{
   {"ShouldBeFirst", "Text Should Be First"},
   {"ShouldBeSecond", "Text Should Be Second"},
   {"ShouldBeThird", "Text Should Be Third"},
   {"ShouldBeFourth", "Text Should Be Fourth"},
}

for _, ns := range CustomSql {
    fmt.Println(ns.name+" = "+ns.sql)
}