目录
流程控制 (Flow Control)
流程控制是编程语言的骨架,决定了代码的执行顺序。Go 语言的流程控制语句非常精炼,主要包括 if(条件判断)、for(循环)、switch(分支)和 goto(跳转)。
1. 条件判断 (if)
Go 的 if 语句看起来和 C/Java 很像,但有两个显著区别:
- 条件表达式不需要括号
()。 - 左大括号
{必须和if在同一行。
1.1 基本用法
go
age := 20
if age > 18 {
fmt.Println("已成年")
} else {
fmt.Println("未成年")
}1.2 if 初始语句
Go 允许在 if 条件之前执行一个简单的语句(通常是变量声明),用分号 ; 隔开。这个变量的作用域仅限于 if-else 代码块内部。
go
// score 变量只在 if 代码块内有效
if score := 90; score >= 90 {
fmt.Println("优秀")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
// fmt.Println(score) // ❌ 报错:undefined: score2. 循环结构 (for)
Go 语言只有 for 循环,没有 while 或 do-while。但 for 可以模拟出所有这些行为。
2.1 标准写法
go
// 初始化; 条件; 后置语句
for i := 0; i < 5; i++ {
fmt.Println(i)
}2.2 类似 while 的写法
省略初始化和后置语句,只保留条件,就变成了 while。
go
i := 0
for i < 5 {
fmt.Println(i)
i++
}2.3 无限循环
省略所有条件,就是死循环(通常配合 break 使用)。
go
for {
fmt.Println("停不下来了...")
break // 必须有跳出机制
}2.4 for range (遍历)
这是 Go 中最常用的遍历方式,适用于数组、切片、字符串、Map 和 Channel。
go
s := "hello"
// i 是索引, v 是值(副本)
for i, v := range s {
fmt.Printf("索引:%d 值:%c\n", i, v)
}
// 如果只需要值,可以用 _ 忽略索引
for _, v := range s {
fmt.Println(v)
}3. 分支结构 (switch)
Go 的 switch 比 C/Java 更加灵活强大。
case默认自带 break,匹配成功后不会穿透到下一个 case。case可以匹配多个值。switch也可以没有表达式,替代复杂的if-else链。
3.1 基本用法
go
day := "Monday"
switch day {
case "Monday", "Tuesday":
fmt.Println("工作日")
case "Saturday", "Sunday":
fmt.Println("周末")
default:
fmt.Println("其他")
}3.2 强制穿透 (fallthrough)
如果你希望匹配后继续执行下一个 case,需要显式使用 fallthrough 关键字。
go
score := 60
switch {
case score >= 60:
fmt.Println("及格了")
fallthrough // 继续向下执行
case score >= 50:
fmt.Println("至少50分") // 这一行也会被打印
}3.3 类型分支 (Type Switch)
switch 还可以用来判断接口变量的实际类型。
go
var x any = "hello"
switch v := x.(type) {
case string:
fmt.Println("是字符串:", v)
case int:
fmt.Println("是整数:", v)
default:
fmt.Println("未知类型")
}4. 跳转控制 (break / continue / goto)
- break: 跳出当前循环或 switch。
- continue: 跳过本次循环,进入下一次。
- goto: 跳转到指定标签(不推荐滥用)。
4.1 配合标签 (Label)
在多层嵌套循环中,break 默认只能跳出最近的一层。如果想直接跳出最外层,需要配合标签。
go
Loop: // 定义标签
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break Loop // 直接跳出最外层 Loop
}
fmt.Println(i, j)
}
}5. 实战:9x9 乘法表
go
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d*%d=%d\t", j, i, i*j)
}
fmt.Println()
}扫描下方二维码,私信【训练营】可进行咨询和报名。 
