# 第 03 课:if 条件判断 ## 学习目标 第二课用变量保存数据,本课根据数据决定执行哪段代码。按 [main.go](./main.go) 中的 1~6 节逐段手敲、运行,暂不引入循环和键盘输入。 本课独占一个目录,共享根目录的 `go.mod`,不需要安装第三方依赖或重新初始化模块。 ## 核心语法 ```go if 条件 { // 条件成立 } else if 另一个条件 { // 前面的条件不成立,且当前条件成立 } else { // 前面的条件都不成立 } ``` - 条件必须是 `bool` 类型,不像 C 那样可以用非零整数表示真。 - 条件通常不加圆括号,大括号不能省略,左大括号与条件写在同一行。 - `else` 与前面的 `}` 写在同一行。 - 多分支从上到下判断,只执行第一个满足条件的分支,其余分支跳过。 - 多个独立的 `if` 则会分别判断,不等于一个 `if / else if` 链。 ### 比较与逻辑运算 | 运算符 | 含义 | 示例 | | --- | --- | --- | | `==` | 相等 | `language == "Go"` | | `!=` | 不相等 | `score != 100` | | `>`、`>=` | 大于、大于等于 | `age >= 18` | | `<`、`<=` | 小于、小于等于 | `score <= 100` | | `&&` | 并且,两侧都为真 | `age >= 18 && hasTicket` | | `\|\|` | 或者,至少一侧为真 | `score < 0 \|\| score > 100` | | `!` | 取反 | `!isClosed` | `=` 是赋值,`==` 才是比较相等。`&&` 和 `||` 会短路求值:左侧已经能决定结果时,不再计算右侧。 ## 编译并运行 以下命令在**仓库根目录**执行: ```powershell # 创建第三课的输出目录 New-Item -ItemType Directory -Force bin/03_conditions | Out-Null # 编译第三课 go build -o ./bin/03_conditions/conditions.exe ./lessons/03_conditions # 运行生成的程序 .\bin\03_conditions\conditions.exe ``` 修改源码后,要再次编译,旧的 exe 不会自动更新。 快速编译并运行也可以使用: ```powershell go run ./lessons/03_conditions ``` 或者从仓库根目录进入本课后执行: ```powershell Set-Location lessons/03_conditions go run . ``` `go run` 仍会先编译再运行,不是解释执行。 ## 预期输出 ```text === 单条件判断 === 年龄:20,已成年 === 是否及格 === 分数:75,及格 === 成绩等级 === 等级:及格 === 逻辑运算 === 已成年、有票且未闭馆,可以入场 周末或节假日,可以安排休息 === 相等与不相等 === 当前学习的语言是 Go 本次成绩不是满分 === 显式布尔条件 === 数量不为零 ``` ## 动手练习 - [ ] 把 `age` 改为 `17`,观察成年判断和入场判断的变化。 - [ ] 将 `score` 依次改为 `59`、`60`、`79`、`80`、`89`、`90`、`100`,检查分数边界。 - [ ] 将 `score` 改为 `-1` 或 `101`,观察成绩等级的非法分数提示。前面的“是否及格”只是二分支语法示范,尚未验证范围;试着给它也加入范围检查。 - [ ] 把 `hasTicket` 改为 `false`,或把 `isClosed` 改为 `true`,观察入场结果。 - [ ] 把 `isWeekend` 和 `isHoliday` 都改为 `false`,观察休息提示是否还会输出。 - [ ] 把 `count` 改为 `0`,观察最后一条提示是否消失。 先手动验证这些输入,不急着封装函数或引入更复杂测试。下一课再学习 `for` 循环。 [上一课:变量与基础类型](../02_variables/README.md) · [学习总览](../../README.md)