条件判断 if/else
本教程共 80 篇 · 第 17 篇 · 更新于 2026-07-27 · 约 6 分钟阅读
17. 条件判断 if/else
本节目标:掌握 Go 的 if 语句,学会 if 带初始化语句的写法,知道什么时候用 if 什么时候用 switch。
基本 if 语法
Go 的 if 和其他语言类似,但有两个特点:
- 条件不需要括号
- 花括号必须有
score := 85
if score >= 60 {
fmt.Println("及格了")
}
不要写成 if (score >= 60),虽然也能编译通过,但不符合 Go 风格。
Warning花括号
{必须和if在同一行,不能换行。这是分号自动插入规则决定的。
if-else
score := 55
if score >= 60 {
fmt.Println("及格了")
} else {
fmt.Println("没及格")
}
else 必须和 if 的右花括号 } 在同一行。
if-else if-else
多分支判断:
score := 85
if score >= 90 {
fmt.Println("优秀")
} else if score >= 80 {
fmt.Println("良好")
} else if score >= 70 {
fmt.Println("中等")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
从上往下依次判断,匹配到第一个满足条件的就执行,后面的不再检查。
if 带初始化语句
Go 的 if 可以在条件前加一个初始化语句,用分号分隔。这是 Go 特有的写法:
if num := 10; num > 5 {
fmt.Println("大于5")
} else {
fmt.Println("小于等于5")
}
num := 10 是初始化语句,num > 5 是条件。num 的作用域只在 if-else 块内,外面访问不了。
实际用途
最常见的用途是在条件判断前获取值并检查错误:
if user, err := getUser(id); err != nil {
fmt.Println("获取用户失败:", err)
} else {
fmt.Println("用户名:", user.Name)
}
// 这里访问不到 user 和 err
这样写的好处是变量不会泄漏到不需要的作用域,代码更干净。
另一个常见用途
if v := computeValue(); v > threshold {
// 使用 v
} else if v > 0 {
// 使用 v
} else {
// 使用 v
}
初始化语句中的变量在整个 if-else 链中都可用。
条件必须是布尔值
Go 的条件必须是 bool 类型,不能用整数、字符串等代替:
count := 1
if count { // 报错:non-bool count used as if condition
fmt.Println("不为零")
}
必须显式写:
if count != 0 {
fmt.Println("不为零")
}
name := ""
if name { // 报错
// ...
}
if name != "" { // 正确
// ...
}
嵌套 if
if 可以嵌套,但别嵌太深:
age := 25
hasLicense := true
if age >= 18 {
if hasLicense {
fmt.Println("可以开车")
} else {
fmt.Println("成年了但没驾照")
}
} else {
fmt.Println("未成年")
}
嵌套超过三层就该考虑重构了。可以用提前返回来减少嵌套:
// 不推荐:嵌套太深
func check(age, score int) string {
if age >= 18 {
if score >= 60 {
if score >= 90 {
return "成年且优秀"
}
return "成年且及格"
}
return "成年但不及格"
}
return "未成年"
}
// 推荐:提前返回,减少嵌套
func check(age, score int) string {
if age < 18 {
return "未成年"
}
if score < 60 {
return "成年但不及格"
}
if score >= 90 {
return "成年且优秀"
}
return "成年且及格"
}
逻辑运算符组合条件
用 &&(与)、||(或)、!(非)组合多个条件:
age := 25
hasLicense := true
if age >= 18 && hasLicense {
fmt.Println("可以开车")
}
if age < 0 || age > 150 {
fmt.Println("年龄不合法")
}
if !hasLicense {
fmt.Println("没有驾照")
}
用括号明确优先级:
if (age >= 18 && hasLicense) || isEmergency {
fmt.Println("允许驾驶")
}
Tip条件复杂时用括号,不要靠优先级记忆。
(a && b) || c比a && b || c更清晰。
if vs switch
多分支判断时,if-else if 链和 switch 都能用。选择标准:
- 条件是同一个变量的不同值:用
switch更清晰 - 条件是不同的表达式:用
if-else if更合适
// 用 switch 更好
switch day {
case "Saturday", "Sunday":
fmt.Println("周末")
default:
fmt.Println("工作日")
}
// 用 if 更好
if age < 18 {
// ...
} else if hasPermission {
// ...
} else if isAdmin {
// ...
}
常见问题
花括号换行
// 报错
if x > 0
{
// ...
}
{ 必须和 if 在同一行。
else 换行
// 报错
if x > 0 {
// ...
}
else {
// ...
}
else 必须跟在 } 后面同一行。
条件用括号
// 不推荐但能编译
if (x > 0) {
// ...
}
// 推荐写法
if x > 0 {
// ...
}
gofmt 不会帮你去掉括号,但 go vet 或编辑器里的 gopls 会提示你。
学完这节你能做什么
- 写基本的 if、if-else、if-else if 判断
- 用 if 带初始化语句简化代码
- 知道条件必须是布尔值
- 用逻辑运算符组合条件
- 判断什么时候用 if,什么时候用 switch
下一节讲 switch 语句。