package main

import "fmt"

// Menu 菜单
type Menu struct {
    ID       int
    ParentID int
    Name     string
    Children []Menu
}

// TreeList 菜单
type TreeList struct {
    ID       int
    ParentID int
    Name     string
    Children []TreeList
}

// FormMenu 格式化菜单
func FormMenu(list []Menu, pid int) (formMenu []Menu) {
    for _, val := range list {
        if val.ParentID == pid {
            if pid == 0 {
                // 顶层
                formMenu = append(formMenu, val)
            } else {
                var children []Menu
                child := val
                children = append(children, child)
            }
        }
    }
    return
}

// GetMenu 获取菜单
func GetMenu(menuList []Menu, pid int) []TreeList {
    treeList := []TreeList{}
    for _, v := range menuList {
        if v.ParentID == pid {
            child := GetMenu(menuList, v.ID)
            node := TreeList{
                ID:       v.ID,
                Name:     v.Name,
                ParentID: v.ParentID,
            }
            node.Children = child
            treeList = append(treeList, node)
        }
    }
    return treeList
}

func main() {
    myMenu := []Menu{
        {ID: 1, ParentID: 0, Name: "用户管理"},
        {ID: 2, ParentID: 0, Name: "会员管理"},
        {ID: 3, ParentID: 0, Name: "权限管理"},
        {ID: 4, ParentID: 2, Name: "会员管理"},
        {ID: 5, ParentID: 2, Name: "黑名单"},
        {ID: 6, ParentID: 4, Name: "会员列表"},
    }

    list := GetMenu(myMenu, 0)
    fmt.Printf("list:%v", list)
}

转自:https://www.jianshu.com/p/fc390424f2b2