Go语言控制流程
续上
1. fallthrough
语句
1.1 什么是fallthrough
语句
在Go语言的switch
语句中,fallthrough
是一个特殊的关键字。在其他语言(如C、Java)的switch
语句中,每个case
分支默认会贯穿执行,即执行完一个case
后会继续执行下一个case
,除非使用break
语句来终止。而在Go语言中,switch
语句的case
分支默认是不会贯穿执行的,每个case
执行完后就会自动跳出switch
语句。fallthrough
关键字的作用就是打破这种默认行为,让程序继续执行下一个case
分支。
1.2 fallthrough
语句的使用示例
下面是一个简单的示例代码,展示了fallthrough
语句的使用:
package main
import "fmt"
func main() {
num := 2
switch num {
case 1:
fmt.Println("数字是1")
case 2:
fmt.Println("数字是2")
fallthrough
case 3:
fmt.Println("数字是3")
default:
fmt.Println("数字不是1、2、3")
}
}
1.3 代码解释
- 在上述代码中,我们定义了一个变量
num
并赋值为2。 - 进入
switch
语句,由于num
的值为2,所以执行case 2
分支,打印出“数字是2”。 - 由于
case 2
分支中使用了fallthrough
语句,程序会继续执行下一个case
分支,即case 3
分支,打印出“数字是3”。 - 最后程序结束。
1.4 运行结果
数字是2
数字是3
1.5 使用fallthrough
的注意事项
fallthrough
语句必须是case
分支的最后一条语句。如果fallthrough
后面还有其他语句,编译器会报错。fallthrough
会直接执行下一个case
分支,而不会再对下一个case
的条件进行判断。
2. for
循环
2.1 仅带条件子句的for
语句
2.1.1 语法结构
for 条件表达式 {
// 循环体
}
这种形式的for
循环类似于其他语言中的while
循环,只要条件表达式的值为true
,就会一直执行循环体。
2.1.2 示例代码
package main
import "fmt"
func main() {
i := 1
for i <= 5 {
fmt.Println(i)
i++
}
}
2.1.3 代码解释
- 首先定义一个变量
i
并初始化为1。 - 进入
for
循环,判断条件i <= 5
是否为true
。由于i
初始值为1,满足条件,所以执行循环体,打印出i
的值,并将i
的值加1。 - 再次判断条件
i <= 5
,只要条件为true
,就会继续执行循环体,直到i
的值变为6,此时条件不满足,循环结束。
2.1.4 运行结果
1
2
3
4
5
2.2 带三个子句的for
语句
2.2.1 语法结构
for 初始化语句; 条件表达式; 后置语句 {
// 循环体
}
- 初始化语句:在循环开始前执行一次,通常用于初始化循环变量。
- 条件表达式:在每次循环开始前进行判断,如果为
true
,则执行循环体;如果为false
,则结束循环。 - 后置语句:在每次循环体执行完毕后执行,通常用于更新循环变量。
2.2.2 示例代码
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
}
2.2.3 代码解释
- 初始化语句
i := 1
将循环变量i
初始化为1。 - 条件表达式
i <= 5
判断i
是否小于等于5,如果是,则执行循环体,打印出i
的值。 - 后置语句
i++
将i
的值加1。 - 重复上述步骤,直到
i
的值变为6,此时条件表达式为false
,循环结束。
2.2.4 运行结果
1
2
3
4
5
2.3 枚举集合元素语句
在Go语言中,可以使用for...range
语句来枚举集合(如数组、切片、映射等)中的元素。
2.3.1 枚举数组元素
package main
import "fmt"
func main() {
numbers := [5]int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
}
2.3.2 代码解释
- 定义一个包含5个元素的整数数组
numbers
。 - 使用
for...range
语句遍历数组,index
表示当前元素的索引,value
表示当前元素的值。 - 每次循环打印出当前元素的索引和值。
2.3.3 运行结果
索引: 0, 值: 1
索引: 1, 值: 2
索引: 2, 值: 3
索引: 3, 值: 4
索引: 4, 值: 5
2.3.4 枚举切片元素
切片的for...range
遍历方式与数组类似:
package main
import "fmt"
func main() {
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Printf("索引: %d, 值: %d\n", index, value)
}
}
2.3.5 枚举映射元素
package main
import "fmt"
func main() {
person := map[string]string{
"name": "John",
"age": "30",
"country": "USA",
}
for key, value := range person {
fmt.Printf("键: %s, 值: %s\n", key, value)
}
}
2.3.6 代码解释
- 定义一个映射
person
,包含姓名、年龄和国家信息。 - 使用
for...range
语句遍历映射,key
表示映射的键,value
表示映射的值。 - 每次循环打印出当前键和值。
2.3.7 运行结果
键: name, 值: John
键: age, 值: 30
键: country, 值: USA
2.4 continue
与break
语句
2.4.1 continue
语句
continue
语句用于跳过当前循环体的剩余部分,直接进入下一次循环。
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}
2.4.2 代码解释
- 当
i
的值为3时,遇到continue
语句,跳过当前循环体的剩余部分(即不执行fmt.Println(i)
),直接进入下一次循环。 - 因此,程序不会打印出3。
2.4.3 运行结果
1
2
4
5
2.4.4 break
语句
break
语句用于提前终止循环,无论循环条件是否满足。
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
if i == 3 {
break
}
fmt.Println(i)
}
}
2.4.5 代码解释
- 当
i
的值为3时,遇到break
语句,直接终止整个循环,不再执行后续的循环。 - 因此,程序只打印出1和2。
2.4.6 运行结果
1
2
3. 代码跳转
3.1 代码标签与goto
语句
3.1.1 语法结构
标签:
// 代码块
goto 标签
goto
语句用于无条件地跳转到指定的标签处继续执行代码。
3.1.2 示例代码
package main
import "fmt"
func main() {
i := 1
Loop:
if i <= 5 {
fmt.Println(i)
i++
goto Loop
}
}
3.1.3 代码解释
- 定义一个变量
i
并初始化为1。 - 定义一个标签
Loop
,标签后面是一个if
语句。 - 如果
i
小于等于5,则打印出i
的值,并将i
的值加1,然后使用goto
语句跳转到Loop
标签处继续执行。 - 重复上述步骤,直到
i
的值变为6,此时if
条件不满足,程序结束。
3.1.4 运行结果
1
2
3
4
5
3.2 break
、continue
语句与代码跳转
break
和continue
语句也可以结合代码标签使用,用于跳出或继续指定的循环。
3.2.1 break
语句结合标签
package main
import "fmt"
func main() {
OuterLoop:
for i := 1; i <= 3; i++ {
for j := 1; j <= 3; j++ {
if i == 2 && j == 2 {
break OuterLoop
}
fmt.Printf("i: %d, j: %d\n", i, j)
}
}
}
3.2.2 代码解释
- 定义一个外层循环和一个内层循环。
- 当
i
的值为2且j
的值为2时,使用break OuterLoop
语句跳出外层循环,不再执行后续的循环。
3.2.3 运行结果
i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
3.2.4 continue
语句结合标签
package main
import "fmt"
func main() {
OuterLoop:
for i := 1; i <= 3; i++ {
for j := 1; j <= 3; j++ {
if i == 2 && j == 2 {
continue OuterLoop
}
fmt.Printf("i: %d, j: %d\n", i, j)
}
}
}
3.2.5 代码解释
- 定义一个外层循环和一个内层循环。
- 当
i
的值为2且j
的值为2时,使用continue OuterLoop
语句跳过外层循环的剩余部分,直接进入下一次外层循环。
3.2.6 运行结果
i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
i: 3, j: 1
i: 3, j: 2
i: 3, j: 3
结论
Go语言的控制流程语句为开发者提供了丰富的选择,能够满足各种不同的编程需求。通过合理使用fallthrough
语句、for
循环以及代码跳转机制,可以编写出高效、灵活的程序。对于初学者来说,掌握这些控制流程语句是迈向编程进阶的重要一步。希望本文能够帮助你更好地理解和使用Go语言的控制流程。