4

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

我发现了一些相关的问题,最接近的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 中表达它。

4

1 回答 1

2

我认为无论谁告诉您您需要reflect是正确的;不过,这可能有点矫枉过正。我认为这里的重复是可以接受的。

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

于 2013-04-14T23:52:31.477 回答