MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

Go语言控制结构详解:if-else、for、switch、for range

2025-05-24 14:34 huorong 精选文章 3 ℃ 0 评论

一、if-else语句

功能:根据条件执行不同的代码块。
特点

  • 条件表达式不需要括号,但代码块必须用花括号 {}。
  • 支持在条件前执行简单语句(如变量初始化)。
  • 支持 else if 多分支。

语法

if 初始化语句; 条件表达式 {
    // 条件为 true 时执行
} else if 条件 {
    // 其他条件
} else {
    // 默认分支
}

示例

// 判断数字正负
num := -5
if num > 0 {
    fmt.Println("正数")
} else if num < 0 {
    fmt.Println("负数")
} else {
    fmt.Println("零")
}

// 条件前初始化变量
if x := 10; x%2 == 0 {
    fmt.Println("x是偶数")
} else {
    fmt.Println("x是奇数")
}

二、for循环

功能:Go 中唯一的循环结构,支持多种循环形式。
特点

  • 三段式(初始化、条件、后置操作)。
  • 类似 while 的单一条件形式。
  • 无限循环(需内部 break 退出)。

语法

// 三段式(传统 for 循环)
for 初始化; 条件; 后置操作 {
    // 循环体
}

// 类似 while 的循环
for 条件 {
    // 循环体
}

// 无限循环
for {
    // 需配合 break 退出
}

示例

// 三段式:计算 1~10 的和
sum := 0
for i := 1; i <= 10; i++ {
    sum += i
}
fmt.Println(sum) // 55

// 类似 while:循环直到满足条件
count := 0
for count < 5 {
    fmt.Println(count)
    count++
}

// 无限循环:读取输入直到用户退出
for {
    var input string
    fmt.Scanln(&input)
    if input == "exit" {
        break
    }
    fmt.Println("输入:", input)
}

三、switch语句

功能:多分支选择结构,替代复杂的 if-else。
特点

  • 每个 case 默认自动 break,无需手动添加。
  • 支持任意类型的表达式(不限于常量或整数)。
  • 支持 fallthrough 强制执行下一个 case。

语法

switch 变量或表达式 {
case 值1, 值2:
    // 匹配值1或值2时执行
case 值3:
    // 匹配值3时执行
default:
    // 默认分支
}

// 无表达式的 switch(等同于 if-else 链)
switch {
case 条件1:
    // 条件1为 true 时执行
case 条件2:
    // 条件2为 true 时执行
}

示例

// 根据星期输出信息
day := "Tuesday"
switch day {
case "Monday":
    fmt.Println("工作日开始")
case "Tuesday", "Wednesday":
    fmt.Println("努力工作")
case "Saturday", "Sunday":
    fmt.Println("休息日")
default:
    fmt.Println("其他工作日")
}

// 使用表达式判断分数等级
score := 85
switch {
case score >= 90:
    fmt.Println("A")
case score >= 80:
    fmt.Println("B")
case score >= 70:
    fmt.Println("C")
default:
    fmt.Println("D")
}

// 使用 fallthrough
x := 10
switch x {
case 10:
    fmt.Println("x=10")
    fallthrough // 强制执行下一个 case
case 20:
    fmt.Println("x=20")
}
// 输出:x=10 → x=20

四、for range循环

功能:遍历数组、切片、字符串、map 或通道(channel)。
特点

  • 返回索引和元素值(map 返回键值对)。
  • 若不需要索引或值,可用 _ 忽略。
  • 遍历 map 时顺序随机。

语法

for 索引, 值 := range 集合 {
    // 循环体
}

示例

// 遍历切片
nums := []int{10, 20, 30}
for index, value := range nums {
    fmt.Printf("索引:%d, 值:%d\n", index, value)
}

// 遍历字符串(获取 Unicode 码点)
str := "Go"
for i, c := range str {
    fmt.Printf("位置:%d, 字符:%c\n", i, c)
}

// 遍历 map
ages := map[string]int{"Alice": 25, "Bob": 30}
for key, value := range ages {
    fmt.Printf("%s 的年龄是 %d\n", key, value)
}

// 忽略索引或值
for _, value := range []int{1, 2, 3} {
    fmt.Println(value)
}

五、控制结构的区别与适用场景

结构

用途

特点

示例场景

if-else

条件分支判断

支持多分支和变量初始化,适合复杂条件组合

根据多个条件执行不同逻辑

for

循环执行代码块

唯一循环结构,支持三段式、while 和无限循环

迭代计算、重复任务处理

switch

多分支选择(替代复杂 if-else 链)

代码更清晰,支持表达式和 fallthrough

枚举值匹配、多条件值判断

for range

遍历集合类型(切片、map 等)

简化迭代过程,自动处理索引和值

遍历数组元素、处理键值对


六、关键区别总结

  1. if-else vs switch
  • if-else 更适合处理范围条件或复杂逻辑(如 score >= 80 && score < 90)。
  • switch 在匹配固定值或多个离散值时更简洁,尤其是使用 case 列表时。
  1. for vs for range
  • for 是通用循环结构,适合需要手动控制迭代逻辑的场景。
  • for range 专为遍历集合设计,自动处理索引和值,代码更简洁。
  1. switch 的灵活性
  • Go 的 switch 支持任意类型表达式,而 C/C++ 的 switch 仅支持整型常量。
  • 通过 switch 无表达式形式(switch { ... }),可实现类似 if-else 链的功能。

七、综合示例

package main

import "fmt"

func main() {
    // if-else 示例
    if num := 7; num%2 == 0 {
        fmt.Println("偶数")
    } else {
        fmt.Println("奇数")
    }

    // for 示例:计算阶乘
    n := 5
    fact := 1
    for i := 1; i <= n; i++ {
        fact *= i
    }
    fmt.Printf("%d! = %d\n", n, fact)

    // switch 示例:类型判断
    var value interface{} = 3.14
    switch v := value.(type) {
    case int:
        fmt.Printf("整数: %d\n", v)
    case float64:
        fmt.Printf("浮点数: %f\n", v)
    default:
        fmt.Println("未知类型")
    }

    // for range 示例:遍历 map
    colors := map[string]string{"red": "#FF0000", "green": "#00FF00"}
    for key, hex := range colors {
        fmt.Printf("%s 的十六进制是 %s\n", key, hex)
    }
}

输出

奇数
5! = 120
浮点数: 3.140000
red 的十六进制是 #FF0000
green 的十六进制是 #00FF00

八、最佳实践

  1. if 的简短语句
    在条件前初始化变量,限制变量作用域,避免命名冲突。
if file, err := os.Open("data.txt"); err == nil {
    // 使用 file
} else {
    fmt.Println("打开文件失败:", err)
}


  1. 避免 switch 滥用
    当逻辑简单时,优先使用 if-else;当需要匹配多个离散值时,使用 switch。
  2. for range 遍历通道
    可用于从通道持续接收值,直到通道关闭。
ch := make(chan int)
go func() {
    ch <- 1
    ch <- 2
    close(ch)
}()
for v := range ch {
    fmt.Println(v) // 输出 1 → 2
}

Tags:if else if else语句格式

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言