2 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于map[string]bool和map[string]string和map[string]Whatever都是不同的類型,創(chuàng)建單個(gè)函數(shù)來(lái)對(duì)所有可能map[string]*類型的鍵進(jìn)行排序的唯一方法是通過反射。
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
}
對(duì)于中間解決方案,由于您可能只關(guān)心幾種類型的組合,您可以使用類型開關(guān)來(lái)提取鍵
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貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是我的 0.02 美元。由于密鑰提取邏輯不太可能改變,并且您希望將所有內(nèi)容都放在一個(gè)地方,您可以創(chuàng)建變體并從中選擇非零映射:
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
}
當(dāng)然,您可以通過添加更多條件來(lái)避免 goto 語(yǔ)句,但我個(gè)人認(rèn)為它更清晰。
然后你可以使用如下函數(shù):
SortedMapKeys(MapVariant{
Bool: map[string]bool{"a": true, "b": false}
})
SortedMapKeys(MapVariant{
String: map[string]string{"c": "v1", "b": "v2"}
})
- 2 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)