为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕后森 2021-11-08 15:51:41
所以可以说我有一个这样的界面地图: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}
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

无需反思;使用类型断言并将值传递回您的 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

}


查看完整回答
反对 回复 2021-11-08
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您可以使用反射:


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 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 传递给该函数,reflect 将自动为您“剥离”地图层。


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信