首页 / Go 语言入门教程 / 条件判断 if/else

Go 语言入门教程

条件判断 if/else

本教程共 80 篇 · 第 17 篇 · 更新于 2026-07-27 · 约 6 分钟阅读

GoGo 入门教程ifelse条件判断流程控制Go if

17. 条件判断 if/else

本节目标:掌握 Go 的 if 语句,学会 if 带初始化语句的写法,知道什么时候用 if 什么时候用 switch。

基本 if 语法

Go 的 if 和其他语言类似,但有两个特点:

  1. 条件不需要括号
  2. 花括号必须有
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) || ca && 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 语句。