go通过数组(切片)构建菜单树结构

2023-11-01

有这样的一组节点,每个节点包含自己的Id,还有父Id (Parent Id),包含children指针数组,但是children是空,需要根据id和parentId把cihldren填充上。

实现了如下的方法

type TreeNode interface {
    ID() int
    ParentID() int
    AppendChildren(interface{})
}
func BuildTree(array []TreeNode) TreeNode {
    maxLen := len(array)
    var rootNode TreeNode = nil
	///<找出根节点,根节点的特点,没有父节点
    for i := 0; i < maxLen; i++ {
        ///< 统计每个节点的父节点出现的次数,父节点出现0次就是根节点
        count := 0
        for j := 0; j < maxLen; j++ {
            ///< 如果有节点的ID == i的parentID 那么j就是父节点
            if array[j].ID() == array[i].ParentID() {
                count++
                array[j].AppendChildren(array[i])
            }
        }
        if count == 0 {
            rootNode = array[i]
        }
    }
    return rootNode
}

以下是测试使用的方法

type DataNode struct {
    Id       int         `json:"id"`
    ParentId int         `json:"parentId"`
    Children []*DataNode `json:"children"`
}

func (d *DataNode) ID() int {
    return d.Id
}

func (d *DataNode) ParentID() int {
    return d.ParentId
}

func (d *DataNode) AppendChildren(node interface{}) {
    d.Children = append(d.Children, node.(*DataNode))
}
func TestBuildTree(t *testing.T) {
    dataArr := []DataNode{
        DataNode{
            Id:       1,
            ParentId: 0,
        },
        DataNode{
            Id:       2,
            ParentId: 1,
        },
        DataNode{
            Id:       3,
            ParentId: 1,
        },
        DataNode{
            Id:       4,
            ParentId: 1,
        },
        DataNode{
            Id:       5,
            ParentId: 2,
        },
        DataNode{
            Id:       6,
            ParentId: 2,
        },
        DataNode{
            Id:       7,
            ParentId: 3,
        },
        DataNode{
            Id:       8,
            ParentId: 3,
        },
        DataNode{
            Id:       9,
            ParentId: 3,
        },
    }
    nodeArray := make([]TreeNode, len(dataArr))
    for i := 0; i < len(dataArr); i++ {
        nodeArray[i] = &dataArr[i]
    }
    rootNode := BuildTree(nodeArray)
    rootNodeByte, err := json.Marshal(rootNode)
    retStr := string(rootNodeByte)
    if err != nil {
        t.Fail()
    } else {
        if retStr == `{"id":1,"parentId":0,"children":[{"id":2,"parentId":1,"children":[{"id":5,"parentId":2,"children":null},{"id":6,"parentId":2,"children":null}]},{"id":3,"parentId":1,"children":[{"id":7,"parentId":3,"children":null},{"id":8,"parentId":3,"children":null},{"id":9,"parentId":3,"children":null}]},{"id":4,"parentId":1,"children":null}]}` {
            t.Log("pass")
        } else {
            t.Fail()
        }
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go通过数组(切片)构建菜单树结构 的相关文章

  • 在 OSX 上交叉编译 Go?

    我正在尝试在 OSX 上交叉编译 go 应用程序以构建适用于 Windows 和 Linux 的二进制文件 我已经阅读了网上能找到的所有内容 我发现的最接近的例子已经发布在 除了疯狂邮件列表上许多未完成的讨论之外 http solovyov
  • 如何从 golang fyne 容器中删除对象

    我正在开发 GUI 应用程序 需要动态添加和删除 gui 元素 我想知道是否有办法从 golang fyne 容器中删除元素 在下面的示例代码中 我创建了容器并动态添加元素 现在我希望能够删除这些元素而不是隐藏它们 我尝试的一个 解决方案
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • 是否可以在 Golang 中 pickle 结构实例

    我正在 Golang 中做一些机器学习 我现在碰壁了 我训练有素的分类器需要将近半分钟的时间来训练 并且想要保存分类器的该实例 这样我就不必每次都从头开始训练 在 Golang 中应该如何去做呢 仅供参考 我的分类器是一个结构 当我用 py
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • Go 编程 - 使用指针绕过访问权限

    假设我的项目有以下层次结构 fragment fragment go main go 并且在fragment go我有以下代码 只有一个 getter 没有 setter package fragment type Fragment str
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • 优化 golang 中的数据结构/字对齐填充

    与我在 C 中学到的类似 我相信填充导致了两个结构体实例大小的差异 type Foo struct w byte 1 byte x byte 1 byte y uint64 8 bytes type Bar struct x byte 1
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • Go SQL查询不一致

    我在执行查询时遇到一些非常奇怪的不一致 并且想知道是否有人知道原因 想象一下我有一个定义如下的结构 type Result struct Afield string db A Bfield interface db B Cfield str
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 如何从非英语字符串解析go中的月份

    我想将以下字符串解析为 go 中的日期 This item will be released on March 9 2014 我跟着this https stackoverflow com questions 14106541 go par
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1

随机推荐

  • Unity游戏性能分析最终指南 04

    本节将深入探讨Unity中各个分析工具和调试工具的功能 以下是分析工具 调试工具和静态分析工具之间的差异 分析工具对代码执行情况进行仪表化显示并收集时间数据 调试工具允许逐步执行程序 暂停和检查值 并提供许多其他高级功能 例如 Frame
  • 计算机网络之TCP三次握手

    文章目录 计算机网络之TCP三次握手 1 TCP三次握手过程 2 TCP三次握手原因 而不是两次 3 TCP三次握手原因 而不是四次 4 TCP三次握手能携带数据吗 5 三次握手连接阶段 最后一次ACK包丢失 会发生什么 6 TCP 握手为
  • 【css】关于css3的多列布局出现错乱问题

    一开始给外部的container设置了column count 2 当里面的每个item是偶数个时 布局是正常显示的 而当我们设置了奇数个item时 会出现下图的错乱布局 在item里面设置了以下两个属性之后 height 100 over
  • 口袋妖怪letsgo服务器维护,口袋妖怪letsgo新手玩法-新手攻略分享-可可网

    口袋妖怪letsgo新手怎么玩 对于刚入口袋妖怪的萌新 一切还属于在探索的阶段 这是前人总结的经验就对于我们的帮助非常大 具体内容有哪些 下面一起和小编看看吧 新手玩法分享 1 留意主线沙盘里的一起物品 无论是建筑还是NPC 他都有可能是你
  • 【go基础】变量声明

    1 第一个go语言程序 package main 声明所属的包 import fmt func main fmt Println hello world go run hello go 执行当前文件 输出 hello world 也可以构建
  • 调用百度翻译自动翻译网页

    lt script src js jquery 3 2 1 min js gt lt script gt lt script src md5 js gt lt script gt lt script type text javascript
  • 使用React做个简单的页面-01

    1 页面效果 2 项目结构 具体代码 root js pc index js pc header js 移动端代码调整 页脚页面 1 页面效果 代码实现 pc index js 注册模块开发 1 页面效果 代码实现 移动端效果 代码实现 i
  • ptmalloc分析之基础一

    ptmalloc分析之基础一 一 内存布局 下面给出32位模式下进程默认内存布局 从上图可以看到 栈至顶向下扩展 并且栈是有界的 堆至底向上扩展 mmap 映射区域至顶向下扩展 mmap 映射区域和堆相对扩展 直至耗尽虚拟地址空间中的剩余区
  • Elasticsearch性能可视化监控环境搭建(离线安装)

    由于ES集群运行有时候不稳定导致数据无法正常读写 所以需要对各类影响因素进行监控 ES有提供cat API在命令行对ES集群健康状态以及其他指标 但只能查看实时状态 如果需要持续的关注集群的运行状态 必定是要定时将集群的各类指标数据进行存储
  • 聊聊我所了解的今年秋招的就业情况

    本文封面配图来自知乎曾加plus 哈喽 大家好 我是王博Kings 秋招慢慢收尾 陆陆续续互联网公司都或者已经提前结束了秋招进程 大家的offer也都陆陆续续拿到手了 每一年就业情况其实是大家都普遍最关心的内容 尤其薪资水平 其实今年年初我
  • ubuntu vim 不能正常显示中文的解决方法

    ubuntu vim 不能正常显示中文 vi etc vim vimrc 在最后加入 set fileencodings utf 8 gb2312 gbk gb18030 set termencoding utf 8 set encodin
  • Android实战篇 阅读并同意“用户协议”与“隐私政策” 【Kotiln / Java】

    一 前言 SpannableStringBuilder 1 SpannableStringBuilder和SpannableString的区别类似与StringBuilder String 2 SpannableStringBuilder可
  • Qt 添加动态库.so文件的正确方法

    1 选中项目 右键 选中 Add Library 完成后 内容自动更新到Pro文件 我原来认为是手写的 qt添加动态库 so文件的正确方法 qt so CSDN博客
  • 软件测试—学习路线

    1 入门期 手工测试 利用测试用例去检验程序是否正确输出结果 通俗来说就是在编写程序结束后自己会运行几个例子来检查程序是否正确运行 而这样的行为就是手工测试 不过企业上手工测试的测试用例会比较刁钻 容易发现自动化测试发现不了的问题 不过这种
  • 用Openssl建立私有CA并颁发证书

    1 建立CA根证书 1 1生成私钥 openssl req newkey rsa 1024 sha1 config myopenssl cnf keyout rootkey pem out rootreq pem days 3650 1 2
  • 联想笔记本Ubuntu14.04 无法连接无线网络,WiFi已通过硬件开关禁用

    最近给一台联想笔记本装Ubuntu14 04系统 开机后屏幕右上角没有WiFi信息出现 倒是有个灰体的 WiFi已通过硬件开关禁用 看到这我的内心奔腾而过一群草原动物 开机就关WiFi 不能连WiFi的笔记本还能搞啥 莫着急 慢慢来 看这字
  • HDFS常见的问题和处理方法积累

    Hadoop常见问题与解决办法 问题1 reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限 问题描述 问题剖析 解决方案 问题2 Too many fetch failures 问题描述 问题剖析 解决方案 问题
  • 解决el-select下拉框有值但是无法选中的问题

    问题描述 在某次开发项目时 发现el select组件无法选中数据了 下拉框中数据可以正常展示 数据是通过接口获取的 解决方案 在 el select 中加一个 change 的事件刷新一下 代码如下
  • top命令的使用和查看某个进程占用的系统内存大小

    一 top指令查看CPU状态和内存使用状态 1 查看CPU占用率 CPU 上次更新到现在的CPU时间占用百分比 2 查看内存占用率 MEM 进程使用的物理内存百分比 3 RES 进程使用的 未被换出的物理内存大小 单位kb RES CODE
  • go通过数组(切片)构建菜单树结构

    有这样的一组节点 每个节点包含自己的Id 还有父Id Parent Id 包含children指针数组 但是children是空 需要根据id和parentId把cihldren填充上 实现了如下的方法 type TreeNode inte