2 回答
TA贡献1827条经验 获得超9个赞
由于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
}
TA贡献2003条经验 获得超2个赞
这是我的 0.02 美元。由于密钥提取逻辑不太可能改变,并且您希望将所有内容都放在一个地方,您可以创建变体并从中选择非零映射:
type MapVariant struct {
Bool map[string]bool
String map[string]string
}
func SortedMapKeys(variant MapVariant) (keyList []string) {
if variant.String != nil {
for k := range variant.String {
keyList = append(keyList, k)
}
goto SORT
}
if variant.Bool != nil {
for k := range variant.Bool {
keyList = append(keyList, k)
}
goto SORT
}
SORT:
sort.Strings(keyList)
return
}
当然,您可以通过添加更多条件来避免 goto 语句,但我个人认为它更清晰。
然后你可以使用如下函数:
SortedMapKeys(MapVariant{
Bool: map[string]bool{"a": true, "b": false}
})
SortedMapKeys(MapVariant{
String: map[string]string{"c": "v1", "b": "v2"}
})
- 2 回答
- 0 关注
- 163 浏览
添加回答
举报