golang通过递归遍历生成树状结构
生活随笔
收集整理的這篇文章主要介紹了
golang通过递归遍历生成树状结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
業務場景:
? ? ? ?一個機構查詢科室信息的時候,希望返回樹狀結構的嵌套格式;
解決辦法:
? ? ?通過遞歸和指針,嵌套成對應的結構體;
? ? ? 借鑒了前人的代碼,但是最后遞歸的指針調用自己也是調試了半天才出來,這里獻上完整的示例代碼.? ? ? ?
?
package mainimport ("fmt""encoding/json" )type dept struct {DeptId string `json:"deptId"`FrameDeptStr string `json:"frameDeptStr"`Child []*dept `json:"child"` } func main() {depts := make([]dept,0)var a depta.DeptId = "1"a.FrameDeptStr = ""depts = append(depts,a)a.DeptId="3"a.FrameDeptStr = "1"depts = append(depts,a)a.DeptId="4"a.FrameDeptStr = "1"depts = append(depts,a)a.DeptId="5"a.FrameDeptStr = "13"depts = append(depts,a)a.DeptId="6"a.FrameDeptStr = "13"depts = append(depts,a)fmt.Println(depts)deptRoots := make([]dept,0)for _,v := range depts{if v.FrameDeptStr == ""{deptRoots= append(deptRoots,v)}}pdepts := make([]*dept,0)for i,_ := range depts{var a *depta = &depts[i]pdepts = append(pdepts,a)}//獲取了根上的科室fmt.Println("根上的科室有:",deptRoots)var node *deptnode = &depts[0]makeTree(pdepts,node)fmt.Println("the result we got is",pdepts)data, _ := json.Marshal(node)fmt.Printf("%s", data)}func has(v1 dept,vs []*dept) bool {var has boolhas = falsefor _,v2 := range vs {v3 := *v2if v1.FrameDeptStr+v1.DeptId == v3.FrameDeptStr{has = truebreak}}return has}func makeTree(vs []*dept,node *dept) {fmt.Println("the node value in maketree is:",*node)childs := findChild(node,vs)fmt.Println(" the child we got is :",childs)for _,child := range childs{fmt.Println("in the childs's for loop, the child's address here is:",&child)node.Child = append(node.Child,child)fmt.Println("in the child's for loop, after append the child is:",child)if has(*child,vs) {fmt.Println("i am in if has")fmt.Println("the child in if has is:",*child)fmt.Println("the child in if has 's address is:",child)makeTree(vs,child)}}}func findChild(v *dept,vs []*dept)(ret []*dept) {for _,v2 := range vs{if v.FrameDeptStr+v.DeptId == v2.FrameDeptStr{ret= append(ret,v2)}}return }代碼備注: 通過frame_dept_str來確定科室之間的關系的, (a.frame_dept_str= a's parent's frame_dept_str + a's parent's dept_id).
總結
以上是生活随笔為你收集整理的golang通过递归遍历生成树状结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql树状数据结构_树状结构的数据表
- 下一篇: 杨鹏《十七天搞定GRE单词》