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

いいね、または「役に立った」とコメントしてください

おすすめ

転載: blog.csdn.net/Deng_Xian_Sheng/article/details/130779944