【Go语言基础【7】】条件语句
文章目录
- 零、概述
- 一、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 时执行
}
package mainimport "fmt"func main() {var a int = 100if a < 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 时执行
} else if 布尔表达式2 {// 条件2为 true 时执行
} else {// 所有条件不满足时执行
}
var age int = 18
if age < 18 {fmt.Println("nice")
} else if age < 28 {fmt.Println("beauty") // 输出此行
} else if age < 38 {fmt.Println("sexy")
} else {fmt.Println("next")
}
3. 条件嵌套与优化
在 if
或 else if
块中嵌套其他条件语句,但需注意嵌套深度不宜过高,否则影响可读性。
package mainimport "fmt"func main() {var a, b int = 100, 200if a == 100 { // 外层条件if b == 200 { // 内层条件fmt.Printf("a 的值为 100 , b 的值为 200\n") // 输出此行}}// 输出:a 值为 : 100,b 值为 : 200fmt.Printf("a 值为 : %d\n", a)fmt.Printf("b 值为 : %d\n", b)
}
优化嵌套(提前返回)
原嵌套代码:
var (height float32 = 1.9age uint = 30gender string = "male"passed bool
)if height > 1.8 {if age > 25 && age <= 35 {if gender == "male" {passed = true // 条件全部满足时标记通过}}
}
优化后(提前返回):
if height <= 1.8 {return // 不满足身高条件,直接终止
}
if age <= 25 || age > 35 {return // 不满足年龄条件,直接终止
}
if gender != "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
)func main() {gender := 1 // Maleswitch gender {case Unknown:fmt.Println("未知性别")case Male:fmt.Println("男性") // 输出此行case Female:fmt.Println("女性")default:fmt.Println("无效性别")}
}
2. fallthrough 穿透执行
默认情况下,case
匹配后自动终止 switch
。若需要继续执行下一个 case
,使用 fallthrough
(注意:会忽略下一个 case
的条件检查)。
var score = 130 func main() {score = 150switch {case score >= 100: // 匹配条件fmt.Println("奖励 100 金币")fallthrough // 穿透到下一个 case(不检查条件)case score > 150: // 无论条件是否成立,都会执行(因穿透)fmt.Println("额外奖励 50 经验值") // 输出此行fallthrough // 继续穿透case score >= 200:fmt.Println("再奖励 1 个道具") // 积分 150 不满足条件,但因穿透仍执行default:fmt.Println("无奖励")}
}
输出结果:
奖励 100 金币
额外奖励 50 经验值
再奖励 1 个道具
3. break 终止执行
在 case
中使用 break
可提前终止 switch
,即使存在 fallthrough
也不会继续执行。
示例代码(审批流程)
var approvalStatus int = 2 // 复审阶段switch approvalStatus {
case 1: // 初审fmt.Println("初审通过")if 需要终止流程 { // 假设条件为 truebreak // 终止 switch,不会执行 fallthrough}fallthrough // 若未 break,穿透到 case 2
case 2: // 复审fmt.Println("复审通过") // 仅当 approvalStatus=2 或 case 1 未 break 时执行
case 3: // 终审fmt.Println("终审通过")
}