golang别再使用递归将切片组成树形结构辣!戳辣!

递归的健壮性很低,容易导致无限递归

不使用递归组树,安全,稳定,声誉:

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
              }
            ]
          }
        ]
      }
    ]
  }
]

给我点个赞吧,或者评论“有用”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng_Xian_Shemg

捐助1元钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值