You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:17:01