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

Go语言如何筛选平均分高于80的嵌套结构体Result数组

Go 实现基于平均分的Result数组筛选

实现前需要注意边界处理:StudentData结构体中的Report是指针类型,取值前必须做判空校验,否则会触发空指针panic。

基础实现代码

以下是入参、出参均为[]Result的筛选函数,默认逻辑为:只要学生关联的任意一条成绩记录平均分高于80,就保留该学生记录:

// FilterByAverage 筛选平均分高于80的学生记录
func FilterByAverage(results []Result) []Result {
    // 预分配结果切片容量,减少动态扩容开销
    filteredRes := make([]Result, 0, len(results))

    for _, resItem := range results {
        matchFlag := false
        for _, infoItem := range resItem.Info {
            // 空成绩报告直接跳过,避免panic
            if infoItem.Report == nil {
                continue
            }
            if infoItem.Report.Average > 80 {
                matchFlag = true
                // 命中条件后直接终止内层遍历,减少无效计算
                break
            }
        }
        if matchFlag {
            filteredRes = append(filteredRes, resItem)
        }
    }

    return filteredRes
}

逻辑调整说明

如果业务规则是需要计算学生所有科目的总平均分高于80才保留,只需要替换内层遍历的判断逻辑即可,参考实现如下:

// 替换上述代码中内层for循环的逻辑
var totalScore float64
var validSubjectNum int
for _, infoItem := range resItem.Info {
    if infoItem.Report == nil {
        continue
    }
    totalScore += infoItem.Report.Average
    validSubjectNum++
}
// 先判断有效科目数大于0,避免除零错误
if validSubjectNum > 0 && (totalScore/float64(validSubjectNum)) > 80 {
    matchFlag = true
}

额外注意点

  • 上述实现为浅拷贝,由于Result中的Info是切片类型(引用类型),如果后续修改返回结果中的Info内容,会同步修改原始入参的对应数据。如果需要隔离原始数据和结果数据,在追加结果时做深拷贝即可。
  • 如果业务对浮点数精度有要求,可以在比较Average前先做精度截断处理,避免浮点数精度误差导致的判断偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:42:28