Golang Go语言中,如何实现这样的嵌套循环?

发布于 1周前 作者 songsunli 来自 Go语言

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

"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

感谢!


Golang Go语言中,如何实现这样的嵌套循环?

更多关于Golang Go语言中,如何实现这样的嵌套循环?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

46 回复

OP 表述能力堪忧……你这代码既看不出来有什么分组也看不出来有什么循环。

更多关于Golang Go语言中,如何实现这样的嵌套循环?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不知道你想说啥,不过下面的赋值用 map 不是就可以做到吗?




抱歉啊,我确实没表述清楚,现在我又补了一点信息

要先定义 struct 数据结构再解析,一直用 hashmap 可不是什么好习惯。

额,多谢啊。请问能帮忙解决一下我的问题吗?

相对复杂的结构不是特别适合用 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)

emmm ,才注册不久,评论不能用 markdown ,tab 缩进也会被吃掉么…
代码片段 OP 凑合看看吧

定义一个 children struct ,然后使用 children 数组



我想实现的是最上面的那个结构
"manage": {
“ent”: {
“export”: true,
“get”: true,
“plan”: true
}
},


php 不太懂。。
go 的话,我觉得是一样的道理啊,把要解析的字段都定义到 struct 里,然后直接解析

试了好久,就是不行,能帮忙研究一下嘛,多谢拉

看起来就是一个链表

这是树状结构吧……什么奇葩设计。你是想把树状拍平么?

哈哈,crud ,集合操作,大道至简在这儿就不太管用了。

是的,就是打算把树状拍平,有咩有办法啊? 大佬

都树状了,那就递归啊……另外我不知道你的 json 数据是谁,怎么提供的,要我就喷死设计这个接口的人。

是啊,我现在就是递归,问题是,水平有限,递归不到拍平的样子 o(╥﹏╥)o

首先,按照 给出的结构反序列化。

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

建议补一下数据结构……


go<br>func flatten(ent *entry) []*entry {<br>entries := make([]*entry, 0)<br>entries = append(entries, ent)<br>for child := range ent.children {<br>entries = append(entries, flatten(child)...)<br>}<br>return entries<br>}<br>

草,v2ex 的 markdown 机制好迷。

定义一个结构
struct Child{
Id int json:"id"
Name string json:"name"
ParentId int json:"parent_id"
Children json.RawMessage json:"children"
}

把结果发序列化之后,把 child.Children 字段继续递归反序列化,最后存到一个数组就行了

可能理解错了吧,我是要拍平成类似链表的感觉

树状怎么可能变成链表。

o(╥﹏╥)o ,好吧,看来我只能换个思路了,哎,多谢了

完全没看明白想干啥,如果是想动态解析 json 文件,然后取得里面一些值的话,试试 gjson

https://github.com/tidwall/gjson

你写的是 list 转 map

然后你问 map 压平怎么压




你真的搞清楚你想问什么了????


这个看不懂的话就没人能帮你了
https://go.dev/play/p/oje5ib9Pu-n

List 的 key index 拼接处理成 map 的 key?

用 go 把 json 发送给 php 处理完了在返回 json🤣🤣🤣

能给个输入+对应的输出吗?
给了 2 个例子, 一个没输入, 一个没期望输出.

要操作树, 你肯定要会 bfs 和 dfs, 这 2 个不理解, 代码肯定不会写.

用这个 https://github.com/tidwall/gjson, 你的意思应该是根据 keypath 获取 value 吧
go<br>package main<br><br>import "<a target="_blank" href="http://github.com/tidwall/gjson" rel="nofollow noopener">github.com/tidwall/gjson</a>"<br><br>const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}`<br><br>func main() {<br> value := gjson.Get(json, "name.last")<br> println(value.String())<br>}<br>

不是想解析 json ,我贴 json ,是为了给看结构

不是啊,其实我就是要把 sql 查出来的 List ,里面 的 key index 拼接处理成 map 的 key

你贴了 4 次代码都没解释清楚源结构是什么目标结构是什么,我真的服气。

#15
> 是的,就是打算把树状拍平,有咩有办法啊? 大佬

查询出来的 list 是平坦的,你到底要从 k-v list 拼出一个树还是要把深度>1 的树平坦化成 k-v list ,至今是矛盾的。



你给了这么多示例的 json ,全完全不提表结构是什么,最后一次贴的这有上百个不同单词的 json ,你想让别人怎么心灵感应每个单词 /字段从哪来?




其实上面这么多回复,有灵性的早都可以想出来了

1. 并不需要 map[string]map[string] …,map[string]interface{} 就足够了
2. children 这种嵌套可以用自引用模型直接在查询时查出一个嵌套的结构体
3. 你第一条附言给的数据 flatten 的代码给你了,你试了吗
4. gorm 的文档你好好看了吗,嵌套 preload 你看到了吗

你好像不知道你贴的所有 json 都不叫「一个列表」

巨婴伸手党,等着别人喂

抱歉啊,这几天太忙了,昨天有比较急的事,搞到很晚,目标结构就是我最后一次贴的 json ,其实我现在已经换了一种方法实现了,也就是最后一次贴的代码,只是实现的比较蹩脚,我用 go 输出的树结构,然后我用 vue 拿到数据后,通过 js 的写法实现的!

不是的,是我最后一次贴的 json ,这个是最终要实现的

额,我要的不是一个数组,是最后一次我贴的 json ,非常感谢

我现在就是给树结构到 vue ,然后用 js 处理使用,蹩脚啊!

抱歉抱歉,你写的代码我跑了的,还有上面那个老哥的也是,非常感谢能上心我的问题

表结构,就是第二个 json ,那个实际上是我已经从库里面查询出来生成的树,
表就是以 parent_id,id ,这个父子关系来存数据的,要输出的,就是我最后一次贴的 json

另外多谢提醒,我也是刚上手,go ,哎,抱歉抱歉,添麻烦了!

通透,能传授点经验吗,大佬

切莫侮辱人格,人都有难处的时候! 换位思考、换位思考,不奢望你大神能解我的难,但还希望你能管住自己的手,🙏🏻

在Golang(Go语言)中,实现嵌套循环非常直接且直观,你可以使用for循环来嵌套另一个for循环。下面是一个简单的示例,演示如何实现嵌套循环:

package main

import "fmt"

func main() {
    // 外层循环:遍历0到2
    for i := 0; i < 3; i++ {
        // 内层循环:遍历0到4
        for j := 0; j < 5; j++ {
            // 打印当前i和j的值
            fmt.Printf("i = %d, j = %d\n", i, j)
        }
        // 可以在外层循环的末尾添加一些逻辑,比如打印一个换行符
        fmt.Println("---")
    }
}

在这个示例中,外层循环变量i从0开始,小于3时继续循环;内层循环变量j从0开始,小于5时继续循环。每次内层循环完成后,外层循环会继续下一次迭代。这样可以实现任意深度的嵌套循环,只需根据需要在适当的位置添加更多的for循环即可。

嵌套循环常用于处理多维数组或矩阵,或者在需要同时遍历多个集合时。注意,在使用嵌套循环时,要确保循环的终止条件合理,以避免产生无限循环,影响程序的性能和稳定性。

希望这个解释能帮助你理解如何在Go语言中实现嵌套循环。如果你有更具体的问题或场景,请随时提问!

回到顶部