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 }