遍历包含不同级别映射的接口映射

So lets say I have a map of interface like this:

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

Assuming that test is a map[string]map[string]map[string]string and test2 is map[string]string.

How would I create a for loop that would enumerate each index of the map and would enumerate through each index's map also?

So far I have gotten:

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
}

No need for reflection; use a type assertion and pass the value back to your sanitize function

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
}

You can use reflect:

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
}

The carveat is: every value in the map has to be either not a map (atom) or a map[string]interface{}. Note map[string]interface{} and map[string]map[string]interface{} are completely unrelated types, and you cannot use a type assertion of the second type on the first one.

However, you can put a map[string]map[string]string in a map[string]interface{}, like this:

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

Now you can pass outerMap to the function, and reflect will automatically "strip" the layers of maps for you.