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

递归遍历任意数量的嵌套映射

递归遍历任意数量的嵌套映射

Go
慕盖茨4494581 2022-10-10 10:29:42
我有一个 API,它返回任意数量的地图,嵌套任意数量的深度。一个例子:data=map[a:map[first_seen:2021-10-20 values:[map[h:<nil> ip:142.250.188.206 ip_count:474360 ip_organization:Google LLC]]] aaaa:map[first_seen:2021-10-20 values:[map[h:<nil> ipv6:2607:f8b0:4004:836::200e ipv6_count:459302 ipv6_organization:<nil>]]] mx:map[first_seen:2021-08-04 values:[map[hostname:aspmx.l.google.com hostname_count:1.3895903e+07 hostname_organization:Google LLC priority:10] map[hostname:alt4.aspmx.l.google.com hostname_count:8.616356e+06 hostname_organization:Google LLC priority:50] map[hostname:alt3.aspmx.l.google.com hostname_count:8.676906e+06 hostname_organization:Google LLC priority:40] map[hostname:alt2.aspmx.l.google.com hostname_count:1.3572714e+07 hostname_organization:Google LLC priority:30]如何递归循环通过这样的数据结构?如何在最深层次获得地图的关键价值?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

像这样的东西应该对你有用——简单的深度优先地图步行者。它在每个叶子节点上调用你的回调函数visit()(“叶子”被定义为“不是地图”),传递它

  • 包含路径(指向项目的键)的切片/数组,

  • 项目的密钥,以及

  • 物品的价值

type Visit func( path []interface{}, key interface{}, value interface{} )


func MapWalker( data map[interface{}]interface{}, visit Visit ) {

  traverse( data, []interface{}{}, visit )

}


func traverse( data map[interface{}]interface{}, path []interface{}, visit Visit ) {


  for key, value := range data {


    if child, isMap := value.(map[interface{}]interface{}); isMap {


      path = append( path, key )

      traverse( child, path, visit )

      path = path[:len(path)-1]


    } else {


      visit( path, key, child )


    }


  }


}

用法很简单:



func do_something_with_item( path []interface{}, key, value interface{} ) {

  // path is a slice of interface{} (the keys leading to the current object

  // key is the name of the current property (as an interface{})

  // value is the current value, agains as an interface{}

  //

  // Again it's up to you to cast these interface{} to something usable

}


MapWalker( someGenericMapOfGenericMaps, do_something_with_item )

每次在树中遇到叶节点时,do_something_with_item()都会调用您的函数。


查看完整回答
反对 回复 2022-10-10
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

如果是 JSON 响应,我有一个包:


package main


import (

   "fmt"

   "github.com/89z/parse/json"

)


var data = []byte(`

{

   "soa": {

      "values":[

         {"email_count":142373, "ttl":900}

      ]

   }

}

`)


func main() {

   var values []struct {

      Email_Count int

      TTL int

   }

   if err := json.UnmarshalArray(data, &values); err != nil {

      panic(err)

   }

   fmt.Printf("%+v\n", values) // [{Email_Count:142373 TTL:900}]

}

https://github.com/89z/parse


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

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