Go语言中递归提取MenuItem切片的CategoryId集合实现方案
递归提取所有层级CategoryId的实现方法
针对嵌套的MenuItem结构,有两种实用的实现方式可以提取所有层级的CategoryId:
方法一:递归函数返回切片
这种方式逻辑直观,通过递归函数逐层返回当前节点及子节点的CategoryId切片,再合并结果:
type MenuItem struct { Id int32 Type string SortOrder int8 CategoryId int32 Children []*MenuItem } func ExtractCategoryIDs(menu []MenuItem) []int32 { var ids []int32 for _, item := range menu { ids = append(ids, item.CategoryId) // 递归处理子节点,将子节点结果追加到当前切片 ids = append(ids, extractChildIDs(item.Children)...) } return ids } func extractChildIDs(children []*MenuItem) []int32 { var ids []int32 for _, child := range children { ids = append(ids, child.CategoryId) // 继续递归处理子节点的子节点 ids = append(ids, extractChildIDs(child.Children)...) } return ids }
方法二:传递切片指针(优化性能)
如果菜单节点数量较多,传递切片指针可以减少频繁的切片拷贝开销,直接在目标切片上追加元素:
func ExtractCategoryIDs(menu []MenuItem) []int32 { ids := make([]int32, 0) extractHelper(menu, &ids) return ids } func extractHelper(menu []MenuItem, ids *[]int32) { for _, item := range menu { *ids = append(*ids, item.CategoryId) // 单独处理子节点的递归逻辑 extractChildHelper(item.Children, ids) } } func extractChildHelper(children []*MenuItem, ids *[]int32) { for _, child := range children { *ids = append(*ids, child.CategoryId) extractChildHelper(child.Children, ids) } }
额外说明
- Go的
append是值传递,若底层数组扩容会返回新切片。第一种方法通过返回值合并结果,适合逻辑简单的场景;第二种用指针直接操作切片,性能更优。 - 如果需要对结果去重,可以最后用
map[int32]struct{}辅助处理,按需添加即可。
内容的提问来源于stack exchange,提问作者Robert Mihai
相关产品推荐
相关产品推荐

