golang通过递归遍历生成树状结构的操作

yizhihongxing

下面是详细讲解 golang 通过递归遍历生成树状结构的操作的完整攻略。

操作步骤

  1. 定义节点结构体

首先需要定义节点结构体,表示每一个节点的信息。

type Node struct {
    ID       int       // 节点 ID
    Name     string    // 节点名称
    ParentID int       // 父节点 ID
    Children []*Node   // 子节点
}
  1. 创建节点数组

创建一个节点数组,用于存储所有节点信息。

var treeData = []*Node{
    {ID: 1, Name: "节点 1", ParentID: 0},
    {ID: 2, Name: "节点 2", ParentID: 1},
    {ID: 3, Name: "节点 3", ParentID: 2},
    {ID: 4, Name: "节点 4", ParentID: 1},
    {ID: 5, Name: "节点 5", ParentID: 0},
    {ID: 6, Name: "节点 6", ParentID: 5},
    {ID: 7, Name: "节点 7", ParentID: 6},
}
  1. 定义递归函数

定义一个递归函数 buildTree,用于递归生成树状结构。

func buildTree(parentID int, data []*Node) []*Node {
    var tree []*Node
    for _, v := range data {
        if v.ParentID == parentID {
            children := buildTree(v.ID, data)
            v.Children = children
            tree = append(tree, v)
        }
    }
    return tree
}

该递归函数接受两个参数,分别是父节点 ID 和节点数组,返回生成的树状结构。

递归函数的核心就是在循环节点数组时,判断当前节点的父节点 ID 是否等于传入的父节点 ID。如果等于,表示当前节点为传入节点的子节点,需要继续往下递归。

  1. 生成树状结构

调用 buildTree 函数,传入根节点的父节点 ID 和包含所有节点信息的数组 treeData,即可生成树状结构。

tree := buildTree(0, treeData)
  1. 输出结果

最后,使用 json.Marshal 将生成的树状结构转换为 JSON 格式并输出。

treeJSON, err := json.Marshal(tree)
if err != nil {
    fmt.Println(err)
}
fmt.Println(string(treeJSON))

示例说明

  1. 根据节点数组生成树状结构

假设有以下节点数组:

var treeData = []*Node{
    {ID: 1, Name: "节点 1", ParentID: 0},
    {ID: 2, Name: "节点 2", ParentID: 1},
    {ID: 3, Name: "节点 3", ParentID: 2},
    {ID: 4, Name: "节点 4", ParentID: 1},
    {ID: 5, Name: "节点 5", ParentID: 0},
    {ID: 6, Name: "节点 6", ParentID: 5},
    {ID: 7, Name: "节点 7", ParentID: 6},
}

调用 buildTree 函数,传入根节点的父节点 ID 和节点数组,即可生成树状结构。最后将结果转换为 JSON 格式并输出。

tree := buildTree(0, treeData)
treeJSON, err := json.Marshal(tree)
if err != nil {
    fmt.Println(err)
}
fmt.Println(string(treeJSON))

输出结果为:

[
    {
        "ID": 1,
        "Name": "节点 1",
        "ParentID": 0,
        "Children": [
            {
                "ID": 2,
                "Name": "节点 2",
                "ParentID": 1,
                "Children": [
                    {
                        "ID": 3,
                        "Name": "节点 3",
                        "ParentID": 2,
                        "Children": null
                    }
                ]
            },
            {
                "ID": 4,
                "Name": "节点 4",
                "ParentID": 1,
                "Children": null
            }
        ]
    },
    {
        "ID": 5,
        "Name": "节点 5",
        "ParentID": 0,
        "Children": [
            {
                "ID": 6,
                "Name": "节点 6",
                "ParentID": 5,
                "Children": [
                    {
                        "ID": 7,
                        "Name": "节点 7",
                        "ParentID": 6,
                        "Children": null
                    }
                ]
            }
        ]
    }
]

可以看到,生成了一棵带有子节点的树状结构。

  1. 处理动态节点数组

假设节点数组是动态的,需要从数据库或者其他来源获取。可以通过 GORM 库从数据库获取节点数据。

type TreeNode struct {
    ID       uint   `gorm:"primary_key;auto_increment" json:"id"`
    Name     string `gorm:"type:varchar(100)" json:"name"`
    ParentID uint   `gorm:"index" json:"parent_id"`
}

func GetTreeData() []*Node {
    var treeData []*TreeNode
    db.Find(&treeData)

    var data []*Node
    for _, v := range treeData {
        data = append(data, &Node{
            ID:       v.ID,
            Name:     v.Name,
            ParentID: int(v.ParentID),
        })
    }
    return data
}

然后调用 GetTreeData 函数获取动态节点数据,再传入 buildTree 函数生成树状结构。

treeData := GetTreeData()
tree := buildTree(0, treeData)
treeJSON, err := json.Marshal(tree)
if err != nil {
    fmt.Println(err)
}
fmt.Println(string(treeJSON))

这样,就可以根据动态节点数组生成树状结构了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang通过递归遍历生成树状结构的操作 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Windows7更新补丁KB4022719下载地址 (附KB4022719补丁修复更新内容) 32位/64位

    Windows 7 更新补丁 KB4022719 下载地址 (附 KB4022719 补丁修复更新内容) 32 位/64 位攻略 1. 简介 Windows 7 更新补丁 KB4022719 是微软发布的一个重要安全补丁,用于修复系统中的漏洞和提升系统的稳定性。本攻略将详细介绍如何下载和安装该补丁,并提供一些示例说明。 2. 下载地址 你可以从微软官方网站下…

    other 2023年7月28日
    00
  • 基于ElementUI中Table嵌套实现多选的示例代码

    基于ElementUI中Table嵌套实现多选的示例代码攻略 1. 简介 在ElementUI中,Table组件提供了多种功能和选项,其中包括多选功能。通过嵌套Table组件,我们可以实现更复杂的多选功能,例如在一个表格中选择多个子表格。下面是一个基于ElementUI中Table嵌套实现多选的示例代码攻略。 2. 示例说明 示例1:基本的Table嵌套多选…

    other 2023年7月28日
    00
  • 「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块

    「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块的完整攻略 本文将详细讲解「雕爷学编程」Arduino动手做(28)——RGB全彩LED模块的完整攻略,包括硬件连接、代码编写和两个示例说明。 硬件连接 RGB全彩LED模块有4个引脚,分别是红色引脚、绿色引脚、蓝色引脚和公共引脚。公共引脚需要连接到Arduino的数字引脚上,红色、绿色和蓝色…

    other 2023年5月5日
    00
  • CentOS 7中搭建NFS文件共享存储服务的完整步骤

    下面是在CentOS 7中搭建NFS文件共享存储服务的完整步骤: 步骤一:安装NFS工具 在命令行中执行以下命令: sudo yum install nfs-utils 步骤二:创建共享目录 在命令行中执行以下命令: sudo mkdir /mnt/nfs_share 步骤三:配置NFS服务 用以下命令来打开“/etc/exports”文件,并在文件结尾添加…

    other 2023年6月27日
    00
  • Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单

    Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单 介绍 侧滑菜单是Android应用中常见的UI设计,用户可以通过拖动屏幕边缘实现菜单的弹出。Android提供了DrawerLayout控件来实现侧滑菜单,但其实我们也可以通过自定义HorizontalScrollView控件来简单地实现侧滑菜单。 准备工作 在开始…

    other 2023年6月25日
    00
  • VisualStudio Code怎么切换大小? vscode代码切换大小写的教程

    Visual Studio Code 切换大小写的教程 Visual Studio Code 是一款功能强大的代码编辑器,它提供了许多快捷键和功能来提高开发效率。下面是关于如何在 Visual Studio Code 中切换大小写的完整攻略。 方法一:使用快捷键 Visual Studio Code 提供了一组快捷键来切换选中文本的大小写。以下是常用的快捷键…

    other 2023年8月16日
    00
  • PHP递归调用的小技巧讲解

    此处提供一个“PHP递归调用的小技巧讲解”,包括两个示例说明,具体如下: 标题:PHP递归调用的小技巧讲解 什么是递归调用 递归是指一个函数调用自身或者是调用其他的函数,而这个被调用的函数又会调用自身或者其他的函数,以此类推,形成了一种函数调用的层层递进的情况,这被称为递归调用。递归的使用可以帮助递归算法更加简洁明了。 PHP递归调用的小技巧:静态变量 PH…

    other 2023年6月27日
    00
  • 详解SpringBoot程序启动时执行初始化代码

    我们来详细讲解一下如何在SpringBoot程序启动时执行初始化代码的完整攻略。 什么是SpringBoot SpringBoot是一个开箱即用的轻量级框架,它可以帮助我们快速的构建一个基于Spring的Web应用程序,简化了Spring的配置,提供了自动化配置,是一个优秀的快速开发框架。 在SpringBoot程序启动时执行初始化代码的两种方案 方案1:使…

    other 2023年6月20日
    00
合作推广
合作推广
分享本页
返回顶部