一尘不染

通用地图值

go

想要以类似方式使用地图键,但是地图中的值不同时,我已经遇到过几次这个问题。我以为我可以编写一个函数,将我想要的键类型与interface
{}用作值类型,但是它不起作用。

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
}

不知道是否有一种优雅的方式可以做到这一点,我只是觉得腰部饱满地将简单的东西重写为不同的价值。


阅读 286

收藏
2020-07-02

共1个答案

一尘不染

尽管地图和切片本身是通用的,但它们不是协变的(它们也不是协变的,因为接口不是通用的)。这是使用不具有泛型的语言的一部分,您将不得不重复一些事情。

如果您确实只需要获取任何旧地图的键,则可以使用反射来做到这一点:

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)
}
2020-07-02