2014-09-10 49 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