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
相关产品推荐
相关产品推荐

