所以我想说我有一个这样的界面地图:
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
}
答案 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"你的地图层。