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
		}
	]
}
相关推荐
阿正的梦工坊8 分钟前
【Rust】02-变量、不可变性与基础类型
开发语言·后端·rust
小欣加油1 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
我叫黑大帅1 小时前
通过php 中的Route:: 的写法了解什么是静态类调用
后端·面试·php
JS菌2 小时前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
IT空门:门主3 小时前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
ServBay3 小时前
云端 AI 蜜月期宣告结束,为什么 2026 年开发者转向本地优先架构
后端·ai编程
IT_陈寒3 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端
Sam_Deep_Thinking3 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
南部余额3 小时前
Spring WebClient 从入门到精通
java·后端·spring
摇滚侠3 小时前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea