首页 > 其他分享 >go语言实现无限级分类

go语言实现无限级分类

时间:2022-08-17 08:58:56浏览次数:59  
标签:name tree 分类 pid json gorm 无限 go id

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 {
	Id       int32  `json:"id"`
	Pid      int32  `json:"pid" gorm:"index"`
	Name     string `json:"name" gorm:"size:255"`
	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{
				Id:   row.Id,
				Pid:  row.Pid,
				Name: row.Name,
			}
			t.Children = ListToTree(rows, row.Id)
			tree = append(tree, t)
		}
	}
	return tree
}

标签:name,tree,分类,pid,json,gorm,无限,go,id
From: https://www.cnblogs.com/burndust/p/16593649.html

相关文章

  • 迁移与备份,Dockerfile,Docker私有仓库,Docker-compose,Mysql主从搭建,django读写分离
    1迁移与备份#一个容器内,尽量只有一个软件,不要把mysql,redis,。。。方到一个容器中,而要放到多个容器#镜像---》容器---》装了软件(vim,mysql)---》打包成镜像#打包后的镜......
  • MySQL篇:MySQL主从搭建、django读写分离
    目录一、MySQL主从搭建1.1什么是主从同步?1.2原理1.3搭建步骤1.3.1拉取mysql5.7镜像1.3.2创建一些文件夹,用来做目录映射1.3.3启动两个docker容器1.3.4链接主库1.3.5......
  • django admin用法
    目录djangoadmin用法基本使用给几个字段加标题添加关联的对象自定义后台展示列表字段过滤功能搜索功能djangoadmin用法基本使用fromdjango.contribimportadminfro......
  • mysql 慢了8小时的处理 mongo
    dockermysql时间差8个小时的解决方案1.临时改(重启就失效)  showvariableslike'%time_zone%';  2.解决方案,修改本地(验证过了)dockercp/usr/share/zonei......
  • Let's Go系列---channel的用法及原理
    基本语法创建channelch1:=make(chanstruct{})ch2:=make(chanint,10)读写channel从channel中读取数据叫做recv;向channel写数据叫做send。//发送数据到channel......
  • mongo数据同步的三种方案
    (一)直接复制data目录(需要停止源和目标的mongo服务)1.针对目标mongo服务已经存在,并正在运行的(mongo2-->mongo)。执行步骤:(1).停止源/目标服务器的mongo服务。mongod--db......
  • Modbus转Profinet网关连接英威腾Goodrive200A配置案例
    本案例是Modbus转Profinet网关连接英威腾变频器的配置案例。用到的设备为西门子1200PLC一台,小疆智控Modbus转Profinet网关GW-PN5001一台,英威腾Goodrive200A变频器一台。 ......
  • Picgo介绍和配置 Gitee图床
    Picgo介绍和配置Gitee图床背景最近发现上传到GitHub的图片出现问题,导致之前的博客的图片都显示不了,然后上网查了下,应该是DNS的问题,网上也有很多这方面的处理方案,有兴......
  • BasicDBObject查询MongoDB
    1.查询举例//查询条件设置BasicDBObjectqueryCond=newBasicDBObject();//单个字段queryCond.put("data_source","诊断记录");//in的用法queryCond.put("p......
  • 数组-二分类
    数组二分法查找前提数组为有序数组;数组中没有重复元素。优点逻辑简单难点涉及很多边界条件,对区间定义不清楚,二分法则容易写乱解决方法:原则:循环不变量规则二......