golang实现无限级分类

作者: adm 分类: go 发布时间: 2022-08-29

这是一个简单的递归查找无限分类的示例。本方法一次查询出所有的分类适合无限分类有限,如果无限分类超级多,查找的分类对应的子分类较少,建议用go语言实现无限极分类
这里的ID为正常的商品ID。
PID如果是最大级别的时候为0,如果是其它商品的子分类时为该商品的ID。

// GoodsClassify 商品分类
type GoodsClassify struct {
	ID    uint   // 商品ID
	PID   uint   // 父ID
	Label string // 商品名称
}

// GoodArr 返回的分类数据
type GoodArr struct {
	ID    uint      // 商品ID
	PID   uint      // 父ID
	Label string    // 商品名称
	Level uint      // 深度(层次)
	Child []GoodArr // 子对象
}

func main() {
	var stuArr []GoodsClassify
	stuArr = append(stuArr, GoodsClassify{ID: 1, PID: 0, Label: "图书"})
	stuArr = append(stuArr, GoodsClassify{ID: 2, PID: 1, Label: "文学"})
	stuArr = append(stuArr, GoodsClassify{ID: 3, PID: 1, Label: "历史"})
	stuArr = append(stuArr, GoodsClassify{ID: 4, PID: 3, Label: "古代"})
	stuArr = append(stuArr, GoodsClassify{ID: 5, PID: 0, Label: "乐器"})

	result := getListGoods(stuArr, 0, 0)

	log.Printf("%+v", result)
}

// 获得列出商品分类
func getListGoods(stuAll []GoodsClassify, pid uint, lev uint) []GoodArr {
	var goodArr []GoodArr
	for _, v := range stuAll {
		if v.PID == pid {
			// 这里可以理解为每次都从最原始的数据里面找出相对就的ID进行匹配,直到找不到就返回
			child := getListGoods(stuAll, v.ID, lev+1)
                        if len(child)==0{
				child=make([]GoodArr,0)
			}
			node := GoodArr{
				ID:    v.ID,
				PID:   v.PID,
				Label: v.Label,
				Level: lev,
				Child: child,
			}
			goodArr = append(goodArr, node)
		}
	}
	return goodArr
}

//获取指定分类id下所有的子分类ID,如果需要包含当前ID,需在外部方法再单独append
func (e ModuleCate)GetAllChildId(materialItem []GoodsClassify,id int)[]uint{
	var arr []uint

	for _, cate := range materialItem {
		if cate.ParentId==id{
			arr=append(arr,cate.Id)
			r:=e.GetAllChildId(materialItem ,cate.Id)
			arr=append(arr,r...)
		}
	}
	return arr
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!