2014-09-10 80 views
5

當我想以類似的方式使用映射鍵但是映射中的值不同時,我遇到過幾次這個問題。我想我可以編寫一個函數,它將我想要的鍵類型作爲值類型,但它不起作用。Go Lang通用映射值

func main() { 
    mapOne := map[string]int 
    mapTwo := map[string]double 
    mapThree := map[string]SomeStruct 

    useKeys(mapOne) 
} 
func useKeys(m map[string]interface{}) { 
    //something with keys here 
} 

不知道是否有一個優雅的方式來做到這一點,我只覺得腰部全改寫簡單的事情,對於不同的值。

+2

如果你知道前面有什麼價值類型您關注的是,你可以寫一個'func keys(m interface {})'(或者通過一個通道或者調用一個函數來遞增鍵的函數)並且在[type switch](http://golang.org/ref/spec#Type_switches)它。但是我傾向於重複使用所有按鍵的循環,不僅適用於一般的「編寫Go-Go」原因,而且還適用於更多的編譯時類型檢查。 – twotwotwo 2014-09-10 19:19:46

回答

9

雖然go中的maps和slice本身是通用的,但它們不是協變的(它們也不可能,因爲接口不是泛型)。這是使用沒有泛型的語言的一部分,您將不得不重複一些事情。

如果你真的只需要得到任何舊地圖的鍵,你可以使用反射這樣做:

func useKeys(m interface{}) { 
    v := reflect.ValueOf(m) 
    if v.Kind() != reflect.Map { 
     fmt.Println("not a map!") 
     return 
    } 

    keys := v.MapKeys() 
    fmt.Println(keys) 
} 
+0

謝謝。我知道這是我沒有掌握的語言的某些方面。 – mvryan 2014-09-11 01:32:44