迭代包含不同级别地图的界面地图

时间:2015-09-16 14:42:48

标签: dictionary go interface range slice

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

c := map[string]interface{} {
    "test":    test,
    "test2":   test2,
}

假设testmap[string]map[string]map[string]stringtest2map[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
}

2 个答案:

答案 0 :(得分:1)

无需反思;使用type assertion并将值传递回清理函数

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
}

答案 1 :(得分:0)

您可以使用反射:

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是:地图中的每个值必须是 a map(原子)或map[string]interface{}。注意map[string]interface{}map[string]map[string]interface{}是完全不相关的类型,并且您不能在第一个类型上使用第二种类型的类型断言。

但是,您可以将map[string]map[string]string放在map[string]interface{}中,如下所示:

innerMap1 := make(map[string]interface{})
// map to strings
innerMap1["a"] = "String 1"
innerMap2 := make(map[string]interface{})
// set mappings, maybe to other types

outerMap := make(map[string]interface{})
outerMap["ABC"] = innerMap1
outerMap["DEF"] = innerMap2

现在你可以将outerMap传递给函数,并自动反映" strip"你的地图层。