Go 条件、循环与switch:统计学习达标天数
从一组每天的学习分钟数中计算达标天数,并按结果给出评价。能解释循环、条件判断和最终分类各自放在哪里。
本节目标
从一组每天的学习分钟数中计算达标天数,并按结果给出评价。能解释循环、条件判断和最终分类各自放在哪里。
前置知识
能够声明变量和运行Go程序。本例暂把[]int理解成一组整数,第5篇会进一步比较集合类型。
准备与运行
在一个新的练习目录执行以下命令。目录名可以修改;若该目录已经初始化过模块,不要重复执行go mod init。
mkdir go-lesson-03
cd go-lesson-03
go mod init example.com/devcn/lesson03将下方完整代码保存为当前目录的main.go,然后执行:
go fmt ./...
go run .先用go version确认工具链可用。本例在Go 1.25.7、macOS ARM64环境验证,只使用标准库;没有测试所有操作系统和Go版本。
核心概念
循环用于把同一项处理应用到多条数据,条件判断决定某条数据是否计入结果。这里先规定业务规则:每天学习至少30分钟算达标,所以比较符号必须包含等于。
对切片使用range时可得到索引与元素。本例不需要索引,使用下划线忽略,只保留当天分钟数。count必须放在循环外初始化,否则每处理一天都会被重置。
统计结束后再决定评价。无表达式的switch按case条件从上到下判断,因此应先放更严格的条件count >= 3,再放count > 0。普通分支不会默认继续执行后面的分支,不需要像某些语言一样在每个分支末尾写break。
完整示例
package main
import "fmt"
func main() {
minutes := []int{15, 30, 45, 0}
count := 0
for _, n := range minutes {
if n >= 30 {
count++
}
}
switch {
case count >= 3:
fmt.Println("稳定")
case count > 0:
fmt.Println("继续")
default:
fmt.Println("开始")
}
fmt.Println(count)
}运行后应得到:
继续
2代码如何工作
示例的输入是15、30、45、0。15没有达标,30和45各使count增加1,0不增加,所以最终得到2。
进入switch后,count >= 3不成立,count > 0成立,因此打印“继续”;最后独立输出计数2。把展示逻辑放在统计之后,可避免每一天都输出一个尚未完成的总结。
如果后续还需要“有记录的总天数”,可直接使用切片长度。若要计算达标率,应先处理没有任何记录的情况,不能直接除以零。
常见错误与边界
- 使用
n > 30会漏掉恰好30分钟的记录。 - 先写count > 0再写count >= 3,会使后一个分支对正数失去机会。
- 空切片不会进入循环,count保持0,程序应输出“开始”和0。
- 负分钟数不是合法业务数据。本例把它当作不达标;真实导入流程应明确拒绝或标记无效记录。
练习
依次替换为[]int{}、[]int{30}、[]int{30,45,60},写出每组输入的两行输出。
参考答案
三组结果分别是“开始、0”“继续、1”“稳定、3”。它们覆盖空输入、等于阈值和高档评价分支。
例如只验证边界时,把初始化改成:
minutes := []int{30}如果这一组被判断成不达标,优先检查比较符号,而不是修改循环次数。
文章回复
0 条公开回复