假设我有一张 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]bool
和 map[string]string
和 map[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/