文章目录
- 零、概述
- 一、if 条件语句
- 1. 单条件模型
- 2. 多条件模型(else if)
- 3. 条件嵌套与优化
- 二、switch 条件判断
- 1. 基本用法
- 2. fallthrough 穿透执行
- 3. break 终止执行
零、概述
| 语句类型 | 适用场景 | 核心特点 |
|---|---|---|
if-else | 单条件或简单多条件判断 | 逻辑清晰,适合线性条件判断 |
switch | 多值匹配或复杂条件组合 | 支持值匹配、范围匹配和表达式匹配,fallthrough可灵活控制执行流程 |
嵌套if | 层级依赖的条件判断 | 需控制嵌套深度,优先使用提前返回优化代码结构 |
注意:
- 条件表达式类型:
if后必须是布尔表达式(如a > 10),不能是数值(如if a不合法)。switch的表达式可以是任意类型(如int、string、interface{}等)。
- 代码风格:
- 建议使用
switch替代多层if-else,提高可读性。 case语句按优先级从高到低排列,default放在最后(可选)。
- 建议使用
- 性能:
switch的底层实现为哈希表或跳转表,匹配效率高于链式if-else。
一、if 条件语句
1. 单条件模型
通过布尔表达式判断是否执行对应代码块,else块处理条件为false的情况。
if布尔表达式{// 条件为 true 时执行}else{// 条件为 false 时执行}packagemainimport"fmt"funcmain(){varaint=100ifa<20{fmt.Printf("a 小于 20\n")}else{fmt.Printf("a 不小于 20\n")// 输出此行}// 输出:a 的值为 : 100fmt.Printf("a 的值为 : %d\n",a)}2. 多条件模型(else if)
按顺序判断多个条件,匹配到第一个true的条件即执行对应代码块。
if布尔表达式1{// 条件1为 true 时执行}elseif布尔表达式2{// 条件2为 true 时执行}else{// 所有条件不满足时执行}varageint=18ifage<18{fmt.Println("nice")}elseifage<28{fmt.Println("beauty")// 输出此行}elseifage<38{fmt.Println("sexy")}else{fmt.Println("next")}3. 条件嵌套与优化
在if或else if块中嵌套其他条件语句,但需注意嵌套深度不宜过高,否则影响可读性。
packagemainimport"fmt"funcmain(){vara,bint=100,200ifa==100{// 外层条件ifb==200{// 内层条件fmt.Printf("a 的值为 100 , b 的值为 200\n")// 输出此行}}// 输出:a 值为 : 100,b 值为 : 200fmt.Printf("a 值为 : %d\n",a)fmt.Printf("b 值为 : %d\n",b)}优化嵌套(提前返回)
原嵌套代码:
var(heightfloat32=1.9ageuint=30genderstring="male"passedbool)ifheight>1.8{ifage>25&&age<=35{ifgender=="male"{passed=true// 条件全部满足时标记通过}}}优化后(提前返回):
ifheight<=1.8{return// 不满足身高条件,直接终止}ifage<=25||age>35{return// 不满足年龄条件,直接终止}ifgender!="male"{return// 不满足性别条件,直接终止}passed=true// 所有条件通过二、switch 条件判断
适用于多值匹配场景,比if-else更简洁清晰,支持值匹配、范围匹配和表达式匹配。
1. 基本用法
switch后可跟变量或表达式,case后跟具体值或逗号分隔的多个值,default处理未匹配的情况。
switch表达式{case值1,值2:// 匹配值1或值2// 执行逻辑case值3:// 执行逻辑default:// 可选,未匹配任何 case 时执行// 执行逻辑}const(Unknown=iota// 0Male// 1Female// 2)funcmain(){gender:=1// Maleswitchgender{caseUnknown:fmt.Println("未知性别")caseMale:fmt.Println("男性")// 输出此行caseFemale:fmt.Println("女性")default:fmt.Println("无效性别")}}2. fallthrough 穿透执行
默认情况下,case匹配后自动终止switch。若需要继续执行下一个case,使用fallthrough(注意:会忽略下一个case的条件检查)。
varscore=130funcmain(){score=150switch{casescore>=100:// 匹配条件fmt.Println("奖励 100 金币")fallthrough// 穿透到下一个 case(不检查条件)casescore>150:// 无论条件是否成立,都会执行(因穿透)fmt.Println("额外奖励 50 经验值")// 输出此行fallthrough// 继续穿透casescore>=200:fmt.Println("再奖励 1 个道具")// 积分 150 不满足条件,但因穿透仍执行default:fmt.Println("无奖励")}}输出结果:
奖励 100 金币 额外奖励 50 经验值 再奖励 1 个道具3. break 终止执行
在case中使用break可提前终止switch,即使存在fallthrough也不会继续执行。
示例代码(审批流程)
varapprovalStatusint=2// 复审阶段switchapprovalStatus{case1:// 初审fmt.Println("初审通过")if需要终止流程{// 假设条件为 truebreak// 终止 switch,不会执行 fallthrough}fallthrough// 若未 break,穿透到 case 2case2:// 复审fmt.Println("复审通过")// 仅当 approvalStatus=2 或 case 1 未 break 时执行case3:// 终审fmt.Println("终审通过")}