03 控制结构:if、for、switch 逻辑语句的那些事儿¶
在上节课的思考题中,要求在“飞雪无情”中查找“飞雪”是否存在,可以使用标准库 strings 包中的 Index 或 Contains 函数:
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 语句语法规则¶
- 无需小括号:
if条件表达式不需要()包裹; - 大括号不可省略:每个条件分支的花括号
{}都是必须的,即使内部只有一行代码; - 换行位置严格:
{不能单独换行置于下一行,else也不能与上一个}分开独占一行; - 多分支扩展:可以使用
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")
}
}
运行输出:
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 关键字¶
- 默认无需
break:Go 语言的switch从上到下依次匹配case。一旦匹配成功,执行完该case分支后会 自动跳出 switch 块,无需显式书写break; 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 后面的数据类型必须与该表达式的类型完全一致(例如 j 是 int,case 后面必须是 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)
}
- 初始化语句(如
i := 1):在循环开始前执行一次; - 条件表达式(如
i <= 100):每次循环前求值,若为false则终止循环; - 后置更新语句(如
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 内所有奇数的示例程序。