//数据库结构
type AuthMenu struct {
	MenuId       uint   `json:"menu_id" gorm:"column:menu_id;primaryKey;autoIncrement"` // 主键 
	ParentMenuId uint   `json:"parent_menu_id" gorm:"column:parent_menu_id"`            // 父类,根为0
	Name         string `json:"name" gorm:"column:name"`                                // 名称
	Url          string `json:"url" gorm:"column:url"`                                  // 菜单URL           
	Icon         string `json:"icon" gorm:"column:icon"`                                // 菜单图标
	Cell         string `json:"cell" gorm:"column:cell"`                                // 菜单层级1一级2二级
	DisplayOrder uint   `json:"display_order" gorm:"column:display_order"`              // 菜单顺序
}

用法:


//定义结构体
type Menu struct {
	entities.AuthMenu
	Child []*Menu `json:"child"`
}
func MenuList(c *gin.Context) {
	//定义查询结果数量
	var count int64 
	//定义查询返回结果切片结构体
	var apilist []*Menu
	//公共数据库调用方法
	db := mysql.GetClient()
	sql := db.Debug().Table("auth_menu")
	//可选增加条件如
		sql.Where("menu_id IN (?)", "1,2")
	//查询并返回错误信息	
	err = sql.Order("display_order desc").Count(&count).Find(&apilist).Error
	if err != nil {
		c.JSON(http.StatusOK, gin.H{
			"code":   -1,
			"errMsg": err,
		})
		return
	}
	//如果没有报错则传递数据进行树状重组,默认传0一级分类
	menu := tree(apilist, 0)
	c.JSON(http.StatusOK, gin.H{
		"code": 1,
		"data": menu,
	})
}
//生成树结构
func tree(menus []*Menu, pid uint) []*Menu {
	//定义子节点目录
	var nodes []*Menu
	if reflect.ValueOf(menus).IsValid() {
		//循环所有一级菜单
		for _, v := range menus {
			//查询所有该菜单下的所有子菜单
			if v.ParentMenuId == pid {
				//特别注意压入元素不是单个所有加三个 **...** 告诉切片无论多少元素一并压入
				v.Child = append(v.Child, tree(menus, v.MenuId)...)
				nodes = append(nodes, v)
			}

		}
	}
	return nodes
}

效果如下