golang 无限级树状结构

努力的夏目_1bbc · 2019-07-05 19:32:39

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, root Datanode) { // 创建一个哈希表,用于快速查找子节点 childMap := make(map[int][]*Datanode) for _, node := range Data { childMap[node.PId] = append(childMap[node.PId], node) }

// 递归构建树
buildTree(root, childMap)

}

func buildTree(node Datanode, childMap map[int][]Datanode) { // 查找当前节点的子节点 if children, exists := childMap[node.Id]; exists { node.Child = append(node.Child, children...) // 递归处理子节点 for _, child := range children { buildTree(child, childMap) } } }

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) } } } 你这个存在很严重的性能问题,如果有10级,数据量很大,你这个就循环不过来了,如果写在接口里就不满足开发环境了,其实有两种情况优化一个使用mysql8.0以后得无限父级查询,一个是代码优化

#1