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

Golang中统计产品内Campaign出现次数的技术实现问题

Golang统计产品集合中Campaign出现次数的实现与优化

我来帮你搞定这个统计需求,先看看你现有代码的问题,再给你两种可行的方案——一种是修复你原有切片遍历的逻辑,另一种是更高效的优化方案,适合数据量较大的场景。

方案一:修复原有切片遍历逻辑

你原来的代码思路没问题,但有几处遗漏和小错误,比如append语句没写完,新添加Campaign时Count应该初始化为1(因为当前产品已经是一次出现了)。修复后的完整代码如下:

teasers := []*models.TeaserCount{}
var teaser *models.TeaserCount
for _, product := range ProductResponse.Products {
    // 跳过空的Campaign Id,避免无效统计
    if len(product.Campaign.Id) == 0 {
        continue
    }
    added := false
    // 遍历已有的统计项,找到匹配的就计数+1
    for _, teaserCount := range teasers {
        if teaserCount.Id == product.Campaign.Id {
            teaserCount.Count++
            added = true
            break
        }
    }
    // 如果没找到匹配项,新增一个统计项
    if !added {
        teaser = &models.TeaserCount{
            Id:    product.Campaign.Id,
            Count: 1, // 这里设为1,因为当前产品已经是该Campaign的首次出现
        }
        teasers = append(teasers, teaser)
    }
}

修复点说明:

  • 增加了空Campaign Id的跳过逻辑,过滤无效数据
  • 补全了append语句,将新创建的统计项加入切片
  • 修正了新统计项的Count初始值,从0改为1,符合当前产品的首次出现计数
  • 将teaser改为指针类型,避免结构体值拷贝的额外开销(如果models.TeaserCount是结构体类型的话)

方案二:使用Map优化统计效率

如果需要处理的产品数量较多,用切片遍历查找的效率会很低(时间复杂度O(n²)),这时候用Map来统计会更高效(查找和更新操作都是O(1),整体时间复杂度O(n))。具体实现如下:

// 先用map快速统计每个Campaign的出现次数
campaignCount := make(map[string]int)
for _, product := range ProductResponse.Products {
    if len(product.Campaign.Id) == 0 {
        continue
    }
    campaignCount[product.Campaign.Id]++
}

// 把map的统计结果转成业务需要的[]*models.TeaserCount切片
teasers := []*models.TeaserCount{}
for id, count := range campaignCount {
    teasers = append(teasers, &models.TeaserCount{
        Id:    id,
        Count: count,
    })
}

优势说明:

  • 性能更优:产品数量越大,对比切片遍历的方式性能提升越明显
  • 代码更简洁:减少了嵌套循环,逻辑清晰,降低出错概率
  • 天然去重:Map的Key本身具备唯一性,不需要手动判断Campaign是否已存在

内容的提问来源于stack exchange,提问作者user8581634

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:47