4. Go 控制结构:条件语句和循环

Go 控制结构:条件语句和循环
控制结构是编程语言中 决定代码执行流程 的重要机制。在 Go 语言中,主要有以下几种控制结构:

  1. 条件语句(if / switch)——用于判断逻辑分支
  2. 循环语句(for)——用于执行重复任务
  3. 跳转语句(break / continue / goto)——用于控制循环流

本篇文章将从 基础到进阶,详细讲解 Go 语言的 控制结构,并剖析底层原理。

1. if 条件语句

Go 语言的 if 语句与其他语言类似,但 不需要括号 (),且必须使用 大括号 {}。

1.1 基本 if 语句

package main

import "fmt"

func main() {
    age := 20

    if age >= 18 {
        fmt.Println("成年人")
    }
}

✅ 关键点:
• if 语句块必须使用 {},即使只有一行代码(与 Python 语法不同)。
• 布尔表达式 不需要 (),但必须是 true / false,不能像 C 语言那样使用 1 或 0。

1.2 if-else 语句

package main

import "fmt"

func main() {
    score := 75

    if score >= 90 {
        fmt.Println("优秀")
    } else if score >= 60 {
        fmt.Println("及格")
    } else {
        fmt.Println("不及格")
    }
}

✅ 关键点:
• if-else 结构可以 多层嵌套
• 所有条件都不满足时,执行 else 语句块

1.3 if 语句的短变量声明

Go 允许在 if 语句中 定义变量,变量作用域仅限于 if 代码块:

package main

import "fmt"

func main() {
    if num := 10; num > 5 {
        fmt.Println("num 大于 5")
    } else {
        fmt.Println("num 小于等于 5")
    }
    // fmt.Println(num) // ❌ 这里会报错,因为 num 变量的作用域仅限于 if-else 代码块
}

✅ 适用于在 if 内部使用变量,避免污染外部作用域。

2. switch 语句

Go 语言的 switch 语句比 if-else 更简洁,且 不需要 break,Go 默认不会 “穿透”(fallthrough)。

2.1 基本 switch 语句

package main

import "fmt"

func main() {
    day := 3

    switch day {
    case 1:
        fmt.Println("星期一")
    case 2:
        fmt.Println("星期二")
    case 3:
        fmt.Println("星期三")
    default:
        fmt.Println("未知日期")
    }
}

✅ 关键点:
• switch 语句会 自动 break,不会像 C 语言一样继续执行下一个 case。
• 如果 没有匹配项,则执行 default 语句。

2.2 case 支持多个值

package main

import "fmt"

func main() {
    grade := "B"

    switch grade {
    case "A", "B", "C":
        fmt.Println("及格")
    case "D", "E", "F":
        fmt.Println("不及格")
    default:
        fmt.Println("未知等级")
    }
}

✅ 多个 case 共享同一代码块,等价于:

if grade == "A" || grade == "B" || grade == "C" {
    fmt.Println("及格")
}

2.3 switch 作为 if-else 代替

Go switch 语句支持 布尔表达式:

package main

import "fmt"

func main() {
    score := 85

    switch {
    case score >= 90:
        fmt.Println("优秀")
    case score >= 60:
        fmt.Println("及格")
    default:
        fmt.Println("不及格")
    }
}

✅ 当 switch 没有表达式时,等价于 if-else 结构。

2.4 使用 fallthrough

Go 语言默认 case 之间不会 “穿透”(fallthrough),如果想 强制执行下一个 case,可以使用 fallthrough:

package main

import "fmt"

func main() {
    day := 1

    switch day {
    case 1:
        fmt.Println("今天是周一")
        fallthrough
    case 2:
        fmt.Println("明天是周二") // 由于 fallthrough,这行代码也会执行
    }
}

✅ 仅适用于执行下一个 case,不会无限穿透。

3. for 循环

Go 语言的 for 是唯一的循环结构,不支持 while 和 do-while。

3.1 基本 for 语法

package main

import "fmt"

func main() {
    for i := 1; i <= 5; i++ {
        fmt.Println("第", i, "次循环")
    }
}

✅ 关键点:
• for 由 初始化、条件、递增表达式 组成。
• i++ 是 Go 语言唯一支持的自增表达式(Go 语言不支持 i += 1 这样的表达式作为 for 的递增部分)。

3.2 省略初始语句和递增表达式

package main

import "fmt"

func main() {
    i := 1
    for i <= 5 { // 相当于 while(i <= 5)
        fmt.Println("第", i, "次循环")
        i++
    }
}

✅ 适用于 while 风格的循环。

3.3 无限循环

for {
    fmt.Println("无限循环")
}

✅ 等价于 while(true),需要 break 终止。

3.4 for-range 遍历切片 / 数组

package main

import "fmt"

func main() {
    nums := []int{10, 20, 30}

    for index, value := range nums {
        fmt.Println("索引:", index, "值:", value)
    }
}

✅ for-range 用于遍历 数组、切片、map 和 字符串。

3.5 for-range 遍历 Map

package main

import "fmt"

func main() {
    person := map[string]int{"Alice": 25, "Bob": 30}

    for key, value := range person {
        fmt.Println(key, "年龄:", value)
    }
}

3.6 跳出循环:break 和 continue

for i := 1; i <= 5; i++ {
    if i == 3 {
        continue // 跳过本次循环
    }
    if i == 4 {
        break // 终止循环
    }
    fmt.Println(i)
}
4. 总结

✅ if 语句 支持简短变量声明 if num := 10; num > 5 {}
✅ switch 语句 自动 break,可用于替代 if-else
✅ for 是唯一的循环结构,支持 for-range 遍历数组、切片、Map
✅ break 终止循环,continue 跳过本次循环

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容