跳转至

03 控制结构:if、for、switch 逻辑语句的那些事儿

在上节课的思考题中,要求在“飞雪无情”中查找“飞雪”是否存在,可以使用标准库 strings 包中的 IndexContains 函数:

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Index("飞雪无情", "飞雪")) // 输出 0 (表示匹配子串的起始索引)
}

本流程控制课时将带你讲解 Go 语言中控制代码执行逻辑的核心结构:条件分支 if、选择结构 switch 和循环结构 for


1. if 条件语句

if 语句根据布尔表达式的结果决定分支走向:结果为 true 执行 if 分支,为 false 则执行 else 分支。

示例文件:ch03/main.go

package main

import "fmt"

func main() {
    i := 10
    if i > 10 {
        fmt.Println("i > 10")
    } else {
        fmt.Println("i <= 10")
    }
}

if 语句语法规则

  1. 无需小括号if 条件表达式不需要 () 包裹;
  2. 大括号不可省略:每个条件分支的花括号 {} 都是必须的,即使内部只有一行代码;
  3. 换行位置严格{ 不能单独换行置于下一行,else 也不能与上一个 } 分开独占一行;
  4. 多分支扩展:可以使用 else if 引入更多判断条件。

包含 else if 的多分支结构示例:

package main

import "fmt"

func main() {
    i := 6
    if i > 10 {
        fmt.Println("i > 10")
    } else if i > 5 && i <= 10 {
        fmt.Println("5 < i <= 10")
    } else {
        fmt.Println("i <= 5")
    }
}

运行输出:

5 < i <= 10

if 中的初始化简单语句

Go 语言允许在 if 关键字后先执行一条简单初始化语句,中间用分号 ; 与条件判断隔开:

package main

import "fmt"

func main() {
    if i := 6; i > 10 {
        fmt.Println("i > 10")
    } else if i > 5 && i <= 10 {
        fmt.Println("5 < i <= 10")
    } else {
        fmt.Println("i <= 5")
    }
}

通过简单语句声明的变量(如上述变量 i),作用域仅限于当前的 if-else if-else 整个条件代码块内。


2. switch 选择语句

当条件分支较多时,使用 switch 能大幅提升代码的可读性。

switch 基本用法

package main

import "fmt"

func main() {
    switch i := 6; {
    case i > 10:
        fmt.Println("i > 10")
    case i > 5 && i <= 10:
        fmt.Println("5 < i <= 10")
    default:
        fmt.Println("i <= 5")
    }
}

switch 特性与 fallthrough 关键字

  1. 默认无需 break:Go 语言的 switch 从上到下依次匹配 case。一旦匹配成功,执行完该 case 分支后会 自动跳出 switch 块,无需显式书写 break
  2. fallthrough 穿透:如果需要继续无条件执行紧跟在后面的下一个 case,可以显式添加 fallthrough 关键字:
package main

import "fmt"

func main() {
    switch j := 1; j {
    case 1:
        fallthrough
    case 2:
        fmt.Println("匹配 1 或 2")
    default:
        fmt.Println("没有匹配")
    }
}

switch 后面紧跟求值表达式(如 switch j := 1; j)时,case 后面的数据类型必须与该表达式的类型完全一致(例如 jintcase 后面必须是 int 值)。

对于 switch 后面省略表达式的用法(如 switch { case ... }),在语义上等同于 if-else 分支结构:

package main

import "fmt"

func main() {
    switch {
    case 2 > 1:
        fmt.Println("2 > 1")
    default:
        fmt.Println("2 <= 1")
    }
}

3. for 循环语句

Go 语言仅提供一种循环关键字 —— for。标准的 for 循环由三部分组成,用两个分号 ; 分隔:

package main

import "fmt"

func main() {
    sum := 0
    for i := 1; i <= 100; i++ {
        sum += i
    }
    fmt.Println("the sum is", sum)
}
  1. 初始化语句(如 i := 1):在循环开始前执行一次;
  2. 条件表达式(如 i <= 100):每次循环前求值,若为 false 则终止循环;
  3. 后置更新语句(如 i++):每次循环体执行完毕后调用。

实现类 while 效果

for 循环的三部分都可以省略。省略初始化和更新语句后,for 即可达到传统语言中 while 循环的效果:

package main

import "fmt"

func main() {
    sum := 0
    i := 1
    for i <= 100 {
        sum += i
        i++
    }
    fmt.Println("the sum is", sum)
}

结合 continue 和 break 控制循环

  • continue:立刻跳过本次循环剩余代码,进入下一次循环判断;
  • break:立刻强行终止整个 for 循环。

利用死循环结合 break 重构求和逻辑:

package main

import "fmt"

func main() {
    sum := 0
    i := 1
    for {
        sum += i
        i++
        if i > 100 {
            break
        }
    }
    fmt.Println("the sum is", sum)
}

总结

本课时讲解了 Go 语言中的 if 条件分支、switch 选择结构和 for 循环结构。熟练掌握它们是控制程序业务执行流的基础。

思考题: 请尝试使用 for 循环结合 continue 编写一个打印 1 到 10 内所有奇数的示例程序。