获取值形式嵌套地图类型map [string] interface {}

时间:2017-07-07 12:40:01

标签: go

我试图从嵌套地图中获取所有价值,但我不知道如何做到这一点。

package main

import "fmt"

func main() {
    m := map[string]interface{}{
        "date":       "created",
        "clientName": "data.user.name",
        "address": map[string]interface{}{
            "street": "x.address",
        },
        "other": map[string]interface{}{
            "google": map[string]interface{}{
                "value": map[string]interface{}{
                    "x": "y.address",
                },
            },
        },
        "new_address": map[string]interface{}{
            "address": "z.address",
        },
    }

    for i := range m {
        fmt.Println(m[i])
        // how I can get value from other nested map?
    }
}

我如何从其他嵌套地图中获取价值?

2 个答案:

答案 0 :(得分:2)

您应该使用非西班牙语投射来定位值。

for i := range m {
    nestedMap, ok := m[i].(map[string]interface{})
    if ok {
        // Do what you want
    }
}

更多详情:https://golang.org/ref/spec#Type_assertions

答案 1 :(得分:2)

受@BayRinat answer启发

package main

import "fmt"

func main() {
    m := map[string]interface{}{
        "date":       "created",
        "clientName": "data.user.name",
        "address": map[string]interface{}{
            "street": "x.address",
        },
        "other": map[string]interface{}{
            "google": map[string]interface{}{
                "value": map[string]interface{}{
                    "x": "g.address",
                },
            },
        },
        "new_address": map[string]interface{}{
            "address": "z.address",
        },
        "key1": map[string]interface{}{
            "key2": map[string]interface{}{
                "key3": map[string]interface{}{
                    "key4": map[string]interface{}{
                        "key5": map[string]interface{}{
                            "key6": map[string]interface{}{
                                "key7": map[string]interface{}{
                                    "key": "enough",
                                },
                            },
                        },
                    },
                },
            },
        },
    }

    for i := range m {
        nestedMap, ok := m[i].(map[string]interface{})
        if ok {
            fmt.Println("Key:", i)
            fmt.Println("Value:", getValNestedMap(nestedMap))
        } else {
            fmt.Println("Key:", i)
            fmt.Println("Value:", m[i])
        }
    }

}
func getValNestedMap(m map[string]interface{}) interface{} {
    for i := range m {
        nestedMap, ok := m[i].(map[string]interface{})
        if ok {
            return getValNestedMap(nestedMap)
        }
        return m[i]
    }

    return nil
}

Go Playground