go 语言,如何实现这样的嵌套循环?

2022-05-25 19:05:50 +08:00
 olddogs

请问在数据库里面查询出来的列表,如何循环出这样的分组结构呢?

"manage": {
   "ent": {
   "export": true,
   "get": true,
   "plan": true
  }
},
"oa": {
   "user": {
     "add": true,
     "addDept": true,
     "addUser": true,
     "get": true,
     "plan": true
  }
}

用 php 可以通过循环,这样拼接,但是用 go 就玩不好了

$newList[$v['name']][$v1['name']][$v2['name']] = true

感谢!

3412 次点击
所在节点    Go 编程语言
45 条回复
iamzuoxinyu
2022-05-25 19:22:02 +08:00
OP 表述能力堪忧……你这代码既看不出来有什么分组也看不出来有什么循环。
lizhien
2022-05-25 19:39:08 +08:00
不知道你想说啥,不过下面的赋值用 map 不是就可以做到吗?
olddogs
2022-05-25 19:51:18 +08:00
@iamzuoxinyu
@lizhien

抱歉啊,我确实没表述清楚,现在我又补了一点信息
dcalsky
2022-05-25 20:15:19 +08:00
要先定义 struct 数据结构再解析,一直用 hashmap 可不是什么好习惯。
olddogs
2022-05-25 20:29:04 +08:00
@dcalsky 额,多谢啊。请问能帮忙解决一下我的问题吗?
WintersZhang
2022-05-25 20:38:47 +08:00
相对复杂的结构不是特别适合用 map 来解析吧,实现定义好要解析的 json 相对应的 struct ,然后直接用 json 包的 Unmarshal 就可以了,类似这样:

text := [你要解析的数据]

type entry struct {
Id int `json:"id"`
Name string `json:"name"`
ParentId int `json:"parent_id"`
Children []entry `json:"children"`
}
e := entry{}
json.Unmarshal([]byte(text), &e)
WintersZhang
2022-05-25 20:40:51 +08:00
emmm ,才注册不久,评论不能用 markdown ,tab 缩进也会被吃掉么...
代码片段 OP 凑合看看吧
seers
2022-05-25 20:41:22 +08:00
定义一个 children struct ,然后使用 children 数组
olddogs
2022-05-25 20:50:41 +08:00
@WintersZhang
@seers
我想实现的是最上面的那个结构
"manage": {
"ent": {
"export": true,
"get": true,
"plan": true
}
},
WintersZhang
2022-05-25 20:55:40 +08:00
@olddogs
php 不太懂。。
go 的话,我觉得是一样的道理啊,把要解析的字段都定义到 struct 里,然后直接解析
olddogs
2022-05-25 21:05:44 +08:00
@WintersZhang 试了好久,就是不行,能帮忙研究一下嘛,多谢拉
LoNeFong
2022-05-25 21:05:51 +08:00
看起来就是一个链表
iamzuoxinyu
2022-05-25 21:45:36 +08:00
这是树状结构吧……什么奇葩设计。你是想把树状拍平么?
6IbA2bj5ip3tK49j
2022-05-25 21:50:18 +08:00
哈哈,crud ,集合操作,大道至简在这儿就不太管用了。
olddogs
2022-05-25 21:52:22 +08:00
@iamzuoxinyu 是的,就是打算把树状拍平,有咩有办法啊? 大佬
iamzuoxinyu
2022-05-25 21:54:10 +08:00
@olddogs 都树状了,那就递归啊……另外我不知道你的 json 数据是谁,怎么提供的,要我就喷死设计这个接口的人。
olddogs
2022-05-25 21:57:26 +08:00
@iamzuoxinyu 是啊,我现在就是递归,问题是,水平有限,递归不到拍平的样子 o(╥﹏╥)o
iamzuoxinyu
2022-05-25 22:04:30 +08:00
首先,按照 @WintersZhang 给出的结构反序列化。

```go
func flatten(ent *entry) []*entry {
entries := make([]*entry, 0)
entries = append(entries, ent)
if len(ent.children) > 0 {
entries = append(entries, flatten(ent.children)...)
}
return entries
}
```

建议补一下数据结构……
iamzuoxinyu
2022-05-25 22:06:32 +08:00
@iamzuoxinyu
```go
func flatten(ent *entry) []*entry {
entries := make([]*entry, 0)
entries = append(entries, ent)
for child := range ent.children {
entries = append(entries, flatten(child)...)
}
return entries
}
```
iamzuoxinyu
2022-05-25 22:07:41 +08:00
草,v2ex 的 markdown 机制好迷。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX