递归的健壮性很低,容易导致无限递归
不使用递归组树,安全,稳定,声誉:
package main
import (
"encoding/json"
)
func main() {
//创建一个朴树的结构体
type demo struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
ParentId int `json:"parent_id"`
}
//实例化为变量d,并赋值
d := []*demo{
{
Id: 1,
Name: "邓文怡",
Age: 13,
ParentId: 0,
},
{
Id: 2,
Name: "b",
Age: 2,
ParentId: 1,
},
{
Id: 3,
Name: "c",
Age: 3,
ParentId: 2,
},
{
Id: 4,
Name: "d",
Age: 4,
ParentId: 3,
},
{
Id: 5,
Name: "e",
Age: 5,
ParentId: 0,
},
{
Id: 6,
Name: "f",
Age: 6,
ParentId: 5,
},
{
Id: 7,
Name: "g",
Age: 7,
ParentId: 6,
},
}
//创建一个树形结构的类型
type demo2 struct {
Id int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
ParentId int `json:"parent_id"`
Children []*demo2 `json:"children"`
}
//创建一个map,键为id,值为指针的demo2
d2 := make(map[int]*demo2)
//for循环d
for _, v := range d {
//给d2赋值
d2[v.Id] = &demo2{
Id: v.Id,
Name: v.Name,
Age: v.Age,
ParentId: v.ParentId,
}
}
//声明最终的结果变量
var result []*demo2
//for循环d2
for _, v := range d2 {
//判断d2的值的父级id存在于d2中
if _, ok := d2[v.ParentId]; ok {
//存在则将值追加到父级的子级中
d2[v.ParentId].Children = append(d2[v.ParentId].Children, v)
} else {
//不存在则将值追加到最终结果中
result = append(result, v)
}
}
//将结构体变量序列化为json,并设置间隔
j, err := json.MarshalIndent(result, "", " ")
if err != nil {
panic(err)
}
//打印输出序列化为json的结构体变量
println(string(j))
}
输出结果:
➜ untitled go run untitled.go
[
{
"id": 5,
"name": "e",
"age": 5,
"parent_id": 0,
"children": [
{
"id": 6,
"name": "f",
"age": 6,
"parent_id": 5,
"children": [
{
"id": 7,
"name": "g",
"age": 7,
"parent_id": 6,
"children": null
}
]
}
]
},
{
"id": 1,
"name": "a",
"age": 1,
"parent_id": 0,
"children": [
{
"id": 2,
"name": "b",
"age": 2,
"parent_id": 1,
"children": [
{
"id": 3,
"name": "c",
"age": 3,
"parent_id": 2,
"children": [
{
"id": 4,
"name": "d",
"age": 4,
"parent_id": 3,
"children": null
}
]
}
]
}
]
}
]
给我点个赞吧,或者评论“有用”