猿问

遍历包含不同级别地图的界面地图

所以可以说我有一个这样的界面地图:


c := map[string]interface{} {

    "test":    test,

    "test2":   test2,

}

假设test是map[string]map[string]map[string]string并且test2是map[string]string。


我将如何创建一个 for 循环来枚举地图的每个索引并枚举每个索引的地图?


到目前为止,我已经得到:


func sanitize_map(m map[string]interface{}) map[string]interface{} {

    for k, v := range m {

    //Here is where I want to enumerate through the map of k

    }

    return m

}


慕后森
浏览 184回答 2
2回答

慕尼黑5688855

无需反思;使用类型断言并将值传递回您的 sanitize 函数func sanitizeMap(m map[string]interface{}) map[string]interface{} {    for k, v := range m {        _ = k        if v, ok := v.(map[string]interface{}); ok {            sanitizeMap(v)        }    }    return m}

饮歌长啸

您可以使用反射:import "reflect"func sanitize_map(m map[string]interface{}) map[string]interface{} {    for k, v := range m {        // Do something with the key k        kind := reflect.ValueOf(v).Kind()        if kind == reflect.Map {             // You have to be sure the value is of type map[string]interface{}             newValue := v.(map[string]interface{})             // recursively call sanitize             sanitize_map(newValue)        }    }    return m}所述carveat是:在地图上的每一个值,必须为不一个map(原子)或一个map[string]interface{}。注意map[string]interface{}和map[string]map[string]interface{}是完全不相关的类型,您不能在第一个类型上使用第二个类型的类型断言。但是,您可以将 a 放入 amap[string]map[string]string中map[string]interface{},如下所示:innerMap1 := make(map[string]interface{})// map to stringsinnerMap1["a"] = "String 1"innerMap2 := make(map[string]interface{})// set mappings, maybe to other typesouterMap := make(map[string]interface{})outerMap["ABC"] = innerMap1outerMap["DEF"] = innerMap2现在您可以将 outerMap 传递给该函数,reflect 将自动为您“剥离”地图层。
随时随地看视频慕课网APP

相关分类

Go
我要回答