分享
  1. 首页
  2. 文章

golang 无限级树状结构

努力的夏目_1bbc · · 3204 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main
import(
 //"encoding/json"
 "encoding/json"
 "fmt"
)
type Datanode struct {
 Id int `json:"id"`
 PId int `json:"pid"`
 Name string `json:"name"`
 Child []*Datanode `json:"child"`
}
var Jsondata []byte //存储json数据
func main(){
 Data := make([]Datanode, 0) //存储所有初始化struct
 var a Datanode
 a.Id = 0
 a.PId = -1
 a.Name = "目录"
 Data = append(Data,a)
 a.Id = 1
 a.PId = 0
 a.Name = "一、水果"
 Data = append(Data,a)
 a.Id = 2
 a.PId = 1
 a.Name = "1.苹果"
 Data = append(Data,a)
 a.Id = 3
 a.PId = 1
 a.Name = "2.香蕉"
 Data = append(Data,a)
 a.Id = 4
 a.PId = 0
 a.Name = "二、蔬菜"
 Data = append(Data,a)
 a.Id = 5
 a.PId = 4
 a.Name = "1.芹菜"
 Data = append(Data,a)
 a.Id = 6
 a.PId = 4
 a.Name = "2.黄瓜"
 Data = append(Data,a)
 a.Id = 7
 a.PId = 6
 a.Name = "(1)黄瓜特点"
 Data = append(Data,a)
 a.Id = 8
 a.PId = 4
 a.Name = "3.西红柿"
 Data = append(Data,a)
 a.Id = 9
 a.PId = 0
 a.Name = "三、关系"
 Data = append(Data,a)
 var data []*Datanode
 data = make([]*Datanode,0)
 for i,_ := range Data{
 var a *Datanode
 a = &Data[i]
 data = append(data, a)
 }
 node := &Data[4] //父节点
 maketree(data,node) //调用生成tree
 transformjson(node) //转化为json
 jsontotree(Jsondata) //json 转为struct
}
func maketree(Data []*Datanode, node *Datanode){ //参数为父节点,添加父节点的子节点指针切片
 childs,_ :=havechild(Data,node) //判断节点是否有子节点并返回
 if childs != nil{
 fmt.Printf("\n")
 fmt.Println(*node)
 fmt.Println("子节点:")
 for _ ,v:= range childs{
 fmt.Println(*v)
 } //打印
 node.Child = append(node.Child,childs[0:]...) //添加子节点
 for _,v := range childs{ //查询子节点的子节点,并添加到子节点
 _, has := havechild(Data,v)
 if has {
 maketree(Data, v) //递归添加节点
 }
 }
 }
}
func havechild(Data []*Datanode, node *Datanode)(child []*Datanode,yes bool){
 for _,v := range Data{
 if v.PId == node.Id {
 child = append(child, v)
 }
 }
 if child != nil {
 yes = true
 }
 return
}
func transformjson(Data *Datanode){ //转为json
 Jsondata,_ = json.Marshal(Data)
 fmt.Println(string(Jsondata))
}
func jsontotree(jsondata []byte){ //json转struct
 var a Datanode
 err := json.Unmarshal(jsondata,&a)
 fmt.Println("22222222222222",string(jsondata))
 if err != nil{
 fmt.Println(err)
 }else{
 fmt.Println(a.Id,a.PId,a.Name)
 for _,v := range a.Child{
 fmt.Println(*v)
 }
 }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:努力的夏目_1bbc

查看原文:golang 无限级树状结构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3204 次点击 ∙ 1 赞
2 回复 | 直到 2025年05月15日 08:34:20
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏