golang 無限級樹狀結(jié)構(gòu)

package main
import(
    "encoding/json"
    "fmt"
)

type Datanode struct {
    Id int `json:"id"`
    ParentId int `json:"pid"`
    Name string `json:"name"`
    Child []*Datanode `json:"child"`
}
var Jsondata []byte  //存儲json數(shù)據(jù)
func main(){
    Data := make([]*Datanode, 0)  //存儲所有初始化struct
    a := Datanode{
        Id :0,
        ParentId : -1,
        Name : "目錄",
    }
    Data = append(Data,&a)

    b := Datanode{
        Id:1,
        ParentId:0,
        Name :"一尺迂、水果",
    }
    Data = append(Data,&b)

    c := Datanode{
        Id:2,
        ParentId:1,
        Name :"1.蘋果",
    }
    Data = append(Data,&c)

    d := Datanode{
        Id:3,
        ParentId:1,
        Name :"2.香蕉",
    }
    Data = append(Data,&d)

    e := Datanode{
        Id:4,
        ParentId:0,
        Name :"二叙甸、蔬菜",
    }
    Data = append(Data,&e)

    f := Datanode{
        Id:5,
        ParentId:4,
        Name :"1.芹菜",
    }
    Data = append(Data,&f)

    g := Datanode{
        Id:6,
        ParentId:4,
        Name :"2.黃瓜",
    }
    Data = append(Data,&g)

    h := Datanode{
        Id:7,
        ParentId:6,
        Name :"(1)黃瓜特點",
    }
    Data = append(Data,&h)

    i := Datanode{
        Id:8,
        ParentId:4,
        Name :"3.西紅柿",
    }
    Data = append(Data,&i)

    j := Datanode{
        Id:9,
        ParentId:0,
        Name :"三掂碱、關(guān)系",
    }
    Data = append(Data,&j)

    Anode := Data[0] //父節(jié)點
    makeTree(Data,Anode)  //調(diào)用生成tree
    transformjson(Anode)  //轉(zhuǎn)化為json
    jsontotree(Jsondata)  //json 轉(zhuǎn)為struct
}

func makeTree(Allnode []*Datanode, node *Datanode){        //參數(shù)為父節(jié)點,添加父節(jié)點的子節(jié)點指針切片
    childs,_ :=haveChild(Allnode,node)      //判斷節(jié)點是否有子節(jié)點并返回
        if childs != nil{
            fmt.Printf("\n")
            fmt.Println(*node)
            fmt.Println("子節(jié)點:")

            for _ ,v:= range childs{
                fmt.Println(*v)
            }                                   //打印

            node.Child = append(node.Child,childs[0:]...)    //添加子節(jié)點
            for _,v := range childs{            //查詢子節(jié)點的子節(jié)點制妄,并添加到子節(jié)點
                _, has := haveChild(Allnode,v)
                if has {
                    makeTree(Allnode, v)          //遞歸添加節(jié)點
                }
            }
        }
}

func haveChild(Allnode []*Datanode, node *Datanode)(childs []*Datanode,yes bool){
    for _,v := range Allnode{
        if v.ParentId == node.Id {
            childs = append(childs, v)
        }
    }
    if childs != nil {
        yes = true
    }
    return
}

func transformJson(Data *Datanode){  //轉(zhuǎn)為json

   Jsondata,_ = json.Marshal(Data)

        fmt.Println(string(Jsondata))
}

func jsontoTree(jsondata []byte){  //json轉(zhuǎn)struct
    var tree_node *Datanode
    err := json.Unmarshal(jsondata,&tree_node)
    fmt.Println("22222222222222",string(jsondata))
    if err != nil{
        fmt.Println(err)
    }else{
        fmt.Println(tree_node.Id,tree_node.ParentId,tree_node.Name)
        printTree(tree_node)

        }
    }


func printTree(tree_node *Datanode){
    for _,v := range tree_node.Child {
        fmt.Printf("%d,%d,%s",v.Id,v.ParentId,v.Name)
        fmt.Println("##########")
        if len(v.Child) != 0{
            printTree(v)
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咒林,一起剝皮案震驚了整個濱河市滩字,隨后出現(xiàn)的幾起案子矗愧,更是在濱河造成了極大的恐慌,老刑警劉巖宽堆,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腌紧,死亡現(xiàn)場離奇詭異,居然都是意外死亡畜隶,警方通過查閱死者的電腦和手機壁肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來籽慢,“玉大人浸遗,你說我怎么就攤上這事∠湟冢” “怎么了跛锌?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長届惋。 經(jīng)常有香客問我髓帽,道長,這世上最難降的妖魔是什么盼樟? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任氢卡,我火速辦了婚禮,結(jié)果婚禮上晨缴,老公的妹妹穿的比我還像新娘译秦。我一直安慰自己,他們只是感情好击碗,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布筑悴。 她就那樣靜靜地躺著,像睡著了一般稍途。 火紅的嫁衣襯著肌膚如雪阁吝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天械拍,我揣著相機與錄音突勇,去河邊找鬼。 笑死坷虑,一個胖子當著我的面吹牛甲馋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迄损,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼定躏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痊远,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤垮抗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碧聪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒版,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年矾削,在試婚紗的時候發(fā)現(xiàn)自己被綠了怜瞒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拄查。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晃择,到底是詐尸還是另有隱情垮耳,我是刑警寧澤仿粹,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布朵你,位于F島的核電站,受9級特大地震影響蝴光,放射性物質(zhì)發(fā)生泄漏她渴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蔑祟、第九天 我趴在偏房一處隱蔽的房頂上張望趁耗。 院中可真熱鬧,春花似錦疆虚、人聲如沸苛败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罢屈。三九已至,卻和暖如春篇亭,著一層夾襖步出監(jiān)牢的瞬間缠捌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工译蒂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曼月,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓柔昼,卻偏偏與公主長得像哑芹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岳锁,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容