go语言实现无限级分类

package main

import (
	"fmt"
	"gorm.io/gorm"
)

var GDB *gorm.DB

type T struct {
	Id   int32  `json:"id"`
	Pid  int32  `json:"pid" gorm:"index"`
	Name string `json:"name" gorm:"size:255"`
}

type Tree struct {
	T
	Children []Tree `json:"children"`
}

func main() {
	/**
	创建表,并往表里插入测试数据
	CREATE TABLE `t` (
		`id` INT(10) NOT NULL AUTO_INCREMENT,
		`pid` INT(10) NOT NULL DEFAULT '0' COMMENT '父级别id',
		`name` VARCHAR(255) NOT NULL DEFAULT '0' COMMENT '名称' COLLATE 'utf8mb4_general_ci',
		PRIMARY KEY (`id`) USING BTREE,
		INDEX `pid` (`pid`) USING BTREE
	)
	COLLATE='utf8mb4_general_ci'
	ENGINE=InnoDB
	;
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (1, 0, '广东省');
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (2, 1, '广州市');
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (3, 2, '天河区');
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (4, 2, '海珠区');
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (5, 0, '福建省');
	INSERT INTO `t` (`id`, `pid`, `name`) VALUES (6, 5, '厦门市');
	*/
	GDB = getDB()
	var rows []T
	GDB.Model(T{}).Find(&rows)
	tree := ListToTree(rows, 0)
	fmt.Println(tree)
}

func ListToTree(rows []T, pid int32) []Tree {
	tree := make([]Tree, 0)
	for _, row := range rows {
		if row.Pid == pid {
			t := Tree{
				T: row,
			}
			t.Children = ListToTree(rows, row.Id)
			tree = append(tree, t)
		}
	}
	return tree
}
posted @   burndust  阅读(509)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示