go 循环处理无限极数据

数据表结构:

复制代码
CREATE TABLE `permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限ID',
  `permission_name` varchar(255) DEFAULT NULL COMMENT '权限名称',
  `permission_url` varchar(255) DEFAULT NULL COMMENT '权限路由',
  `status` tinyint(1) DEFAULT NULL COMMENT '权限状态',
  `pid` int(11) DEFAULT NULL COMMENT '父级ID',
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `deleted_at` datetime(3) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_permission_deleted_at` (`deleted_at`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;

代码:

Go 复制代码
//定义结构体存储数据
type Permission_c struct {
	Id             int
	Pid            int
	Status         int
	PermissionName string
	PermissionUrl  string
	Children       []*Permission_c `gorm:"foreignKey:Pid;references:Id"`
}

// 权限列表
func (con Permission_c) PermissionList(c *gin.Context) {
	var permissions []*Permission_c
	if err := database.DB.Table("permission").Find(&permissions).Error; err != nil {
		c.JSON(500, gin.H{
			"error": err,
		})
		return
	}

	// 创建一个映射,方便快速查找每个权限节点
	permissionMap := make(map[int]*Permission_c)
	for _, p := range permissions {
		permissionMap[p.Id] = p
	}
	//
	var pdata []*Permission_c
	for _, p := range permissions {
		if p.Pid == 0 {
			pdata = append(pdata, p)
		} else {
			// 找到父节点
			parent, ok := permissionMap[p.Pid]
			if ok {
				if parent.Children == nil {
					parent.Children = make([]*Permission_c, 0)
				}
				parent.Children = append(parent.Children, p)
			}
		}
	}

	c.JSON(200, gin.H{
		"permission": pdata,
	})
}

处理后的数据:

Go 复制代码
{
	"permission": [
		{
			"Id": 1,
			"Pid": 0,
			"Status": 0,
			"PermissionName": "用户管理",
			"PermissionUrl": "#",
			"Children": [
				{
					"Id": 2,
					"Pid": 1,
					"Status": 0,
					"PermissionName": "账号管理",
					"PermissionUrl": "/backendUsers/permission/list",
					"Children": [
						{
							"Id": 5,
							"Pid": 2,
							"Status": 0,
							"PermissionName": "账号添加",
							"PermissionUrl": "/backendUsers/account/add",
							"Children": null
						},
						{
							"Id": 6,
							"Pid": 2,
							"Status": 0,
							"PermissionName": "账号删除",
							"PermissionUrl": "/backendUsers/account/del",
							"Children": null
						},
						{
							"Id": 8,
							"Pid": 2,
							"Status": 0,
							"PermissionName": "账号修改",
							"PermissionUrl": "/backendUsers/account/upd",
							"Children": null
						}
					]
				},
				{
					"Id": 3,
					"Pid": 1,
					"Status": 0,
					"PermissionName": "角色管理",
					"PermissionUrl": "/backendUsers/role/list",
					"Children": [
						{
							"Id": 9,
							"Pid": 3,
							"Status": 0,
							"PermissionName": "角色添加",
							"PermissionUrl": "/backendUsers/role/add",
							"Children": null
						},
						{
							"Id": 10,
							"Pid": 3,
							"Status": 0,
							"PermissionName": "角色删除",
							"PermissionUrl": "/backendUsers/role/del",
							"Children": null
						},
						{
							"Id": 12,
							"Pid": 3,
							"Status": 0,
							"PermissionName": "角色修改",
							"PermissionUrl": "/backendUsers/role/upd",
							"Children": null
						}
					]
				},
				{
					"Id": 4,
					"Pid": 1,
					"Status": 0,
					"PermissionName": "权限管理",
					"PermissionUrl": "/backendUsers/permission/list",
					"Children": [
						{
							"Id": 13,
							"Pid": 4,
							"Status": 0,
							"PermissionName": "权限添加",
							"PermissionUrl": "/backendUsers/permission/add",
							"Children": null
						}
					]
				}
			]
		},
		{
			"Id": 14,
			"Pid": 0,
			"Status": 0,
			"PermissionName": "商品管理",
			"PermissionUrl": "#",
			"Children": null
		}
	]
}
相关推荐
SamDeepThinking17 分钟前
并发量就算只有2,该上锁还得上呀
java·后端·架构
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
我星期八休息2 小时前
IT疑难杂症诊疗室:AI时代工程师Superpowers进化论
linux·开发语言·数据结构·人工智能·python·散列表
漂流瓶jz3 小时前
UVA-1152 和为0的4个值 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·二分查找·题解·aoapc·算法竞赛入门经典·uva
你撅嘴真丑3 小时前
map 与 set容器的应用--话题焦点人物
数据结构
生成论实验室3 小时前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
li1670902704 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
永远不会的CC5 小时前
浙江华昱欣实习(4月23日~ 4月19日)
后端·学习
直奔標竿6 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring