golang实现无限级分类
这是一个简单的递归查找无限分类的示例。本方法一次查询出所有的分类适合无限分类有限,如果无限分类超级多,查找的分类对应的子分类较少,建议用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
}

