3.3 循环控制语句
为了使程序能够更轻松、更有弹性地达到预期目标,Go语言提供了循环控制语句,用于更改程序的正常执行顺序,当执行离开范围时,在该范围内创建的所有自动对象都将被销毁。Go语言提供了两种循环控制语句:break、continue和goto,在本节的内容中,将详细讲解这三种语句的用法。
3.3.1 break 语句
在Go语言中,break语句有以下三种用法:
(1)用于循环语句中跳出循环,并开始执行循环之后的语句。
(2)在 switch中在执行一条 case后跳出当前语句。
(3)在多重循环中,可以用标号label标出想停止的循环。
实例3-8:模拟田径比赛(源码路径:Go-codes\3\stop.go)
实例文件stop.go的具体实现代码如下所示。
package main
import "fmt"
func main() {
var a int = 1
for a < 25 { //for 循环
fmt.Printf("正在跑第 %d圈\n", a);
a++;
if a == 5 {
break; //使用 break 语句跳出循环
}
}
fmt.Printf("身体不适,我决定退出比赛!");
}
在上述代码中,首先设置只要变量a小于25就执行for循环,并且设置如果a等于5则使用break语句停止循环。执行后会输出:
正在跑第 1圈
正在跑第 2圈
正在跑第 3圈
正在跑第 4圈
身体不适,我决定退出比赛!
身体不适,我决定退出比赛!
Go语言中 break 语句除了可以结束 for、switch 和 select 的代码块外,还可以在语句后面添加标签,表示退出某个标签对应的代码块,对标签的要求是必须定义在对应的for、switch和select的代码块上。例如下面的代码:
package main
import "fmt"
func main() {
OuterLoop:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
switch j {
case 2:
fmt.Println(i, j)
break OuterLoop
case 3:
fmt.Println(i, j)
break OuterLoop
}
}
}
}
执行后会输出:
0 2
对上述代码的具体说明如下:
- 第4行,外层循环的标签。
- 第5行和第6行,嵌套循环。
- 第7行,使用 switch 进行数值分支判断。
- 第10和第13行,退出OuterLoop对应的循环之外,也就是跳转到最后一行。
3.3.2 使用continue语句
在Go语言中,continue 语句和break语句类似,但是 continue 不是跳出循环,而是跳过当前这一次循环,即跳过循环体中当前执行的这次循环,然后接着进行下一次是否执行循环的判定。在多重循环中,可以用标号 label 标出想 continue 的循环。continue语句的执行流程如图3-5所示。
图3-5 continue语句的执行流程
实例3-9:使用标号和不使用标号的区别(源码路径:Go-codes\3\compare.go)
实例文件compare.go的具体实现代码如下所示。
package main
import "fmt"
func main() {
// 不使用标记
fmt.Println("---- continue ---- ")
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue
}
}
// 使用标记
fmt.Println("---- continue label ----")
re:
for i := 1; i <= 3; i++ {
fmt.Printf("i: %d\n", i)
for i2 := 11; i2 <= 13; i2++ {
fmt.Printf("i2: %d\n", i2)
continue re
}
}
}
在上述两段代码中都是在嵌套for循环中使用了continue语句,其中在第二段代码中用到了标号。执行后会输出:
---- continue ----
i: 1
i2: 11
i2: 12
i2: 13
i: 2
i2: 11
i2: 12
i2: 13
i: 3
i2: 11
i2: 12
i2: 13
---- continue label ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
3.3.3 使用goto 语句
在Go语言中,goto 语句可以无条件地转移到程序中指定的行。goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。使用goto语句的语法格式如下:
goto label;
..
.
label: statement;
在上述格式中,在遇到goto 语句时,程序会跳转执行label标签对应的“statement”代码。请看下面的代码,在变量a等于15的时候跳过本次循环并回到循环的开始语句LOOP处。
package main
import "fmt"
func main() {
//定义局部变量
var a int = 10
/*/循环
LOOP: for a < 20 {
if a == 15 {
/* 跳过迭代 */
a = a + 1
goto LOOP
}
fmt.Printf("a的值为 : %d\n", a)
a++
}
}
执行后会输出:
a的值为 : 10
a的值为 : 11
a的值为 : 12
a的值为 : 13
a的值为 : 14
a的值为 : 16
a的值为 : 17
a的值为 : 18
a的值为 : 19
注意:在程序设计中一般不建议使用 goto 语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。