我寫了一個函數,它會從map [string] Foo返回一個排序好的字符串片段。我很好奇創建一個通用例程的最佳方法是什麼,該例程可以從任何類型的字符串作爲關鍵字返回已排序的字符串片段。Go是否允許爲具有特定鍵類型的地圖指定接口?
有沒有辦法使用接口規範來做到這一點?例如,有沒有什麼辦法可以做這樣的事情:
type MapWithStringKey interface {
<some code here>
}
要實現上面的接口,類型將需要字符串作爲鍵。然後,我可以編寫一個通用函數,返回一個排序的鍵列表來滿足類型。
這是用我目前最好的解決方案體現模塊:
func SortedKeys(mapWithStringKey interface{}) []string {
keys := []string{}
typ := reflect.TypeOf(mapWithStringKey)
if typ.Kind() == reflect.Map && typ.Key().Kind() == reflect.String {
switch typ.Elem().Kind() {
case reflect.Int:
for key, _ := range mapWithStringKey.(map[string]int) {
keys = append(keys, key)
}
case reflect.String:
for key, _ := range mapWithStringKey.(map[string]string) {
keys = append(keys, key)
}
// ... add more cases as needed
default:
log.Fatalf("Error: SortedKeys() does not handle %s\n", typ)
}
sort.Strings(keys)
} else {
log.Fatalln("Error: parameter to SortedKeys() not map[string]...")
}
return keys
}
Click for Go Playground version
我被迫碼型爲斷言即使在編譯時每個支持的類型,我們應該知道確切mapWithStringKey參數的類型。
恐怕你需要仿製藥。 Go語言中不包含泛型語言,足夠着名。這就是說,沒有太多的情況下,使用泛型將真正簡化問題:它們通常會增加更多層次和複雜性。 –
我很害怕那個......哦。 –