list - 如何在 Go 中获取映射键的排序列表?

标签 list sorting dictionary go

假设我有一张 map :map[string]string。我想获取此 map 的已排序键列表。所以我可以做这样的事情:

func SortedMapKeys(m map[string]string) (keyList []string) {
    for key := range m {
        keyList = append(keyList, key)
    }
    sort.Strings(keyList)
    return
}

然后我将有另一个 map[string]bool 类型的映射。我也想得到它的 key 。但问题是函数 SortedMapKeys 接受一个 map[string]string 参数。所以我需要编写完全相同的函数,唯一的区别是它会接受 map[string]bool

出于显而易见的原因,这不是一种选择。如果有一天我想改变我如何获取和排序我的 key 的逻辑,我将需要跟踪和更新所有这些功能。此外,我将不得不为所有这些实际上做同样事情的函数编写相同的单元测试,因为它们的主体是 100% 相等的(代码重复)。

有没有什么方法可以创建一个可以接受 map[string]任意 的通用函数?

最佳答案

因为 map[string]boolmap[string]stringmap[string]Whatever 都是不同的类型,唯一的方法创建单个函数来对所有可能的 map[string]* 类型的键进行排序是通过反射。

func SortedMapKeys(m interface{}) (keyList []string) {
    keys := reflect.ValueOf(m).MapKeys()

    for _, key := range keys {
        keyList = append(keyList, key.Interface().(string))
    }
    sort.Strings(keyList)
    return
}

对于中间解决方案,由于您可能只关心几种类型的组合,因此您可以使用类型开关来提取键

func SortedMapKeys(m interface{}) (keyList []string) {
    switch m := m.(type) {
    case map[string]string:
        for k := range m {
            keyList = append(keyList, k)
        }
    case map[string]bool:
        for k := range m {
            keyList = append(keyList, k)
        }
    default:
        panic("unknown map type")
    }

    sort.Strings(keyList)
    return
}

关于list - 如何在 Go 中获取映射键的排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366224/

相关文章:

python - 将我的整数放入 python 中的列表中

python - 为数字字符串创建一个指示符,忽略 python pandas 中的特定数字

python - 将字典值转换为列表?

python - 如何按照特定模式对字符串列表进行排序

java - 如何使用 Gson 将 JSON 转换为 HashMap?

python - 使用reduce方法将具有相似/重复键的字典列表转换为单个字典(值将是列表)

python - 根据条件反转python中的列表

gwt - GET 中的程序化 CellTable 排序不起作用

python-2.7 - 在 python 中使用合并排序排列给定的整数列表以获得最少的数字

dictionary - 如何将字典字典转换为 Ansible vars 文件中的字典列表?