golang:按排序键顺序遍历任意映射

时间:2013-04-14 23:41:45

标签: map go

简而言之:无论地图的类型如何,我如何按排序键顺序遍历地图?

我发现了一些相关问题,the closest one表明如果不依赖reflect模块就无法完成。这种理解是否正确?

考虑这个Go代码,它按照其键的排序顺序遍历两个不同类型的映射:

mapOne := map[int]string {
    1: "a",
    2: "b",
    3: "c",
}
keysOne := make([]int, 0, len(mapOne))
for key, _ := range mapOne {
    keysOne = append(keysOne, key)
}
sort.Ints(keysOne)
for _, key := range keysOne {
    value := mapOne[key]
    fmt.Println(key, value)
}

mapTwo := map[string]int {
    "a": 1,
    "b": 2,
    "c": 3,
}
keysTwo := make([]string, 0, len(mapTwo))
for key, _ := range mapTwo {
    keysTwo = append(keysTwo, key)
}
sort.Strings(keysTwo)
for _, key := range keysTwo {
    value := mapTwo[key]
    fmt.Println(key, value)
}

提取密钥然后对它们进行排序的逻辑与两者重复 不同的地图类型。 有没有办法分解这个逻辑并避免 复制吗

我试图编写一个接口来提供SortedKeys方法。在 特别是,SortedKeys的返回类型取决于地图的类型, 我无法弄清楚如何在Go中表达这一点。

1 个答案:

答案 0 :(得分:2)

我想谁告诉你你需要reflect是正确的;但这可能有点过分了。我认为重复是可以接受的。

(或者,您可以实现自己的地图,使用某种类型的键接口,但您仍然需要为每种基础键类型创建满足接口的类型)