一尘不染

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

go

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

我发现了一些相关的问题,最接近的问题表明,如果不依靠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方法的接口时遇到了麻烦。特别是,of的返回类型SortedKeys取决于地图的类型,我不知道如何在Go中表达它。


阅读 221

收藏
2020-07-02

共1个答案

一尘不染

我认为无论谁告诉您您需要的reflect都是正确的;不过,这可能太过分了。我认为重复在这里是可以接受的。

(或者,您可以实现自己的映射,该映射使用某种类型的键接口,但最终仍然需要为每个基础键类型创建一个满足该接口的类型)

2020-07-02