Go 控制结构:条件语句和循环
控制结构是编程语言中 决定代码执行流程 的重要机制。在 Go 语言中,主要有以下几种控制结构:
- 条件语句(if / switch)——用于判断逻辑分支
- 循环语句(for)——用于执行重复任务
- 跳转语句(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 跳过本次循环