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通过数组(切片)构建菜单树结构 的相关文章

  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • 在 Go 中,如何将结构体转换为字节数组?

    我有一个我定义的结构实例 我想将其转换为字节数组 我尝试了 byte my struct 但这不起作用 另外 我还被指出二进制包 http golang org pkg encoding binary 但我不确定我应该使用哪个函数以及应该如
  • 如何确定 go 中当前运行的可执行文件的完整路径?

    我一直在 osx 上使用这个函数 Shortcut to get the path to the current executable func ExecPath string var here os Args 0 if strings H
  • 为什么 gmail API 以纯文本形式发送 html 电子邮件?

    我正在尝试使用 gmail API 发送 html 电子邮件 但由于某些原因 它会随机以纯文本 文本形式发送电子邮件 谷歌似乎改变了我设置的内容类型标头 这有什么理由吗 电子邮件内容始终完全相同 正如我测试的那样 API 仍处于实验阶段吗
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • 使用 mgo 驱动程序进行 mongo 聚合查询

    我在 mongodb 中有以下查询 db devices aggregate match userId v73TuQqZykbxFXsWo state true project userId 1 categorySlug 1 weight
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • json.Unmarshal json字符串到对象是空结果[重复]

    这个问题在这里已经有答案了 我有一个非常简单的程序 如下所示 package main import encoding json fmt type RunCommand struct level string json level call
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 对嵌套结构使用自定义解组时,GoLang 结构无法正确解组

    我们需要对嵌套在多个其他结构中的结构使用自定义解组器 而这些结构不需要自定义解组器 我们有很多类似的结构B下面定义的结构 类似于嵌套A 代码的输出是true false 0 预期的true false 2 有任何想法吗 Go 游乐场示例he
  • 管理多租户 ArangoDB 连接

    我使用 ArangoDB Go 使用 go driver 并且需要实现多租户 这意味着每个客户都将在单独的数据库中拥有他的数据 我想要弄清楚的是如何使这种多租户发挥作用 我知道为每个请求创建一个新的数据库连接是不可持续的 这意味着我必须维护
  • Golang:如何在HTTP客户端的TLS配置中指定证书

    我有一个证书文件 该位置是 usr abc my crt我想将该证书用于我的 tls 配置 以便我的 http 客户端在与其他服务器通信时使用该证书 我当前的代码如下 mTLSConfig tls Config CipherSuites u
  • 重新设计循环依赖缺陷

    我有一堆小服务 它们共享一些常见的包 例如Logger Configuration and Net 我在单独的项目中编写了每个包 问题是我的Logger需求包Configuration用于设置 和我的Configuration not仅由L
  • 在 golang 中将 []uint32 转换为 []byte,反之亦然

    最有效的 性能 转换方式是什么 uint32向和从 byte在戈兰 例如 func main source uint32 1 2 3 dest make byte 4 len source source to dest check len
  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u
  • 在 Go 中解析多个 JSON 对象

    可以使用以下方法轻松解析如下对象encoding json包裹 something foo something else bar 我面临的问题是当服务器返回多个字典时 如下所示 something foo something else ba

随机推荐

  • 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