DevCN
菜单
全部文章快讯开发深度热点

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}

如果这一组被判断成不达标,优先检查比较符号,而不是修改循环次数。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。