Go 循环语句
一、概述
二、Go 语言 for 循环
三、循环嵌套
四、break 语句
五、 continue 语句
六、goto 语句
一、概述
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
循环程序的流程图:
Go 语言提供了以下几种类型循环处理语句:
循环类型 | 描述 |
---|---|
for 循环 | 重复执行语句块 |
循环嵌套 | 循环中嵌套一个或多个 for 循环 |
1. 循环控制语句
循环控制语句可以控制循环体内语句的执行过程。
GO 语言支持以下几种循环控制语句:
控制语句 | 描述 |
---|---|
break 语句 | 经常用于中断当前 for 循环或跳出 switch 语句 |
continue 语句 | 跳过当前循环的剩余语句,然后继续进行下一轮循环。 |
goto 语句 | 将控制转移到被标记的语句。 |
2. 无限循环
如果循环中条件语句永远不为 false 则会进行无限循环,我们可以通过 for 循环语句中只设置一个条件表达式来执行无限循环:
示例
package mainimport (\"fmt\"\"time\")func main() {i := 0for true { //for后面true为可选,若不加,默认为truefmt.Printf(\"i: %v\\n\", i)i++time.Sleep(time.Second)}}//输出结果如下i: 0i: 1i: 2i: 3i: 4i: 5i: 6i: 7............
二、Go 语言 for 循环
1. 语法
for 循环是一个循环控制结构,可以执行指定次数的循环
语法:
//Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号
//和 C 语言的 for 一样:
for init; condition; post { }//和 C 的 while 一样:for condition { }//和 C 的 for(;;) 一样:for { }
- init: 一般为赋值表达式,给控制变量赋初值
- condition: 关系表达式或逻辑表达式,循环控制条件
- post:一般为赋值表达式,给控制变量增量或减量。
2. for语句执行过程
① 先对表达式 1 赋初值;
② 判别赋值表达式 init 是否满足给定条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。
格式如下:
for key, value := range oldMap {newMap[key] = value}
for 语句语法流程如下图所示:
3. 示例
计算 1 到 10 的数字之和
package mainimport \"fmt\"func main() {sum := 0for i := 0; i <= 10; i++ {sum += i}fmt.Printf(\"sum: %v\\n\", sum)}//输出结果为:55
———————————————————————————————–
//int 和 post 参数是可选的,我们可以直接省略他,类型while语句
package mainimport \"fmt\"func main() {sum := 0i := 1for i <= 10 {sum += ii++}fmt.Printf(\"sum: %v\\n\", sum)}
计算0-100间偶数的和
//求出0-100的偶数和package mainimport \"fmt\"func main() {a := 0for i := 1; i <= 100; i++ {if i%2 == 0 {a += i}}fmt.Printf(\"a: %v\\n\", a)}//输出结果如下2550--------------------------------------------------------------------------------------------//方法二package mainimport \"fmt\"func main() {sum := 0for i := 0; i <= 100; i += 2 {sum += i}fmt.Printf(\"sum: %v\\n\", sum)}
4. For-each range 循环
这种格式的循环可以对字符串、数组、切片等进行迭代输出元素
示例
//循环数组package mainimport \"fmt\"func main() {names := []int{20, 30, 40, 50, 60}//a获取key,b获取valuefor a, b := range names {fmt.Print(\"key:\", a, \" value:\", b, \"\\n\")}}//输出结果如下key:0 value:20key:1 value:30key:2 value:40key:3 value:50key:4 value:60
//使用空白标识符直接获取valuepackage mainimport \"fmt\"func main() {names := []int{20, 30, 40, 50, 60}//a获取key,b获取valuefor _, b := range names {fmt.Print(\"value:\", b, \"\\n\")}}//输出结果value:20value:30value:40value:50value:60
三、循环嵌套
Go 语言允许用户在循环内使用循环
1. 语法
以下为 Go 语言嵌套循环的格式:
for [condition | ( init; condition; increment ) | Range]{for [condition | ( init; condition; increment ) | Range]{statement(s);}statement(s);}
2. 示例
以下实例使用循环嵌套来输出 2 到 100 间的素数:
package mainimport \"fmt\"func main() {/* 定义局部变量 */var i, j intfor i=2; i < 100; i++ {for j=2; j <= (i/j); j++ {if(i%j==0) {break; // 如果发现因子,则不是素数}}if(j > (i/j)) {fmt.Printf(\"%d 是素数\\n\", i);}}}//输出结果如下2 是素数3 是素数5 是素数7 是素数11 是素数13 是素数17 是素数19 是素数23 是素数29 是素数31 是素数37 是素数41 是素数43 是素数47 是素数53 是素数59 是素数61 是素数67 是素数71 是素数73 是素数79 是素数83 是素数89 是素数97 是素数
99乘法表:
package mainimport \"fmt\"func main() {for i := 1; i < 10; i++ {for j := 1; j < i+1; j++ {fmt.Printf(\"%d * %d = %d\\t\", i, j, j*i)}fmt.Println()}}//输出结果如下1 * 1 = 12 * 1 = 2 2 * 2 = 43 * 1 = 3 3 * 2 = 6 3 * 3 = 94 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 165 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 256 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 367 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 498 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 649 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
四、break 语句
1. 语法
Go 语言中 break 语句用于以下两方面:
用于循环语句中跳出循环,并开始执行循环之后的语句。
break 在 switch(开关语句)中在执行一条 case 后跳出语句的作用。
在多重循环中,可以用标号 label 标出想 break 的循环。
break 语法格式如下:
break;
流程如图:
2. 示例
- 在变量 a 大于 15 的时候跳出循环:
package mainimport \"fmt\"func main() {var a int = 10for a < 20 {fmt.Printf(\"a: %v\\n\", a)a++if a > 15 {break}}}//执行结果如下a: 10a: 11a: 12a: 13a: 14a: 15
- 演示使用标记和不使用标记的区别
package mainimport \"fmt\"func main() {//不适用标记fmt.Println(\"----break----\")for i := 1; i <= 3; i++ {fmt.Printf(\"i: %v\\n\", i)for a := 11; a <= 13; a++ {fmt.Printf(\"a: %v\\n\", a)break}}//使用标记fmt.Println(\"----break label----\")fla:for i := 1; i <= 3; i++ {fmt.Printf(\"i: %v\\n\", i)for a := 11; a <= 13; a++ {fmt.Printf(\"a: %v\\n\", a)break fla}}}//输出结果如下----break----i: 1a: 11i: 2a: 11i: 3a: 11----break label----i: 1a: 11
五、 continue 语句
1. 语法
Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。
for 循环中,执行 continue 语句会触发 for 增量语句的执行。
在多重循环中,可以用标号 label 标出想 continue 的循环。
continue 语法格式如下:
continue;
continue 语句流程图如下:
2. 示例
- 在变量 a 等于 15 的时候跳过本次循环执行下一次循环:
package mainimport \"fmt\"func main() {var a int = 10for a < 20 {if a == 15 {a = a + 1continue}fmt.Printf(\"a: %v\\n\", a)a++}}//输出结果如下a: 10a: 11a: 12a: 13a: 14a: 16a: 17a: 18a: 19
- 用多重循环演示使用标记和不使用标记的区别:
package mainimport \"fmt\"func main() {// 不使用标记fmt.Println(\"---- continue ---- \")for i := 1; i <= 3; i++ {fmt.Printf(\"i: %d\\n\", i)for a := 11; a <= 13; a++ {fmt.Printf(\"a: %d\\n\", a)continue}}// 使用标记fmt.Println(\"---- continue label ----\")re:for i := 1; i <= 3; i++ {fmt.Printf(\"i: %d\\n\", i)for a := 11; a <= 13; a++ {fmt.Printf(\"a: %d\\n\", a)continue re}}}//输出结果如下---- continue ----i: 1a: 11a: 12a: 13i: 2a: 11a: 12a: 13i: 3a: 11a: 12a: 13---- continue label ----i: 1a: 11i: 2a: 11i: 3a: 11
六、goto 语句
1. 语法
Go 语言的 goto 语句可以无条件地转移到过程中指定的行
goto 语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
goto 语法格式如下:
goto label;...label: statement;
goto 语句流程图如下:
2. 示例
- 在变量 a 等于 15 的时候跳过本次循环并回到循环的开始语句 LOOP 处:
package mainimport \"fmt\"func main() {/* 定义局部变量 */var a int = 10/* 循环 */LOOP:for a < 20 {if a == 15 {/* 跳过迭代 */a = a + 1goto LOOP}fmt.Printf(\"a的值为 : %d\\n\", a)a++}}//输出结果如下a的值为 : 10a的值为 : 11a的值为 : 12a的值为 : 13a的值为 : 14a的值为 : 16a的值为 : 17a的值为 : 18a的值为 : 19
- goto 语句打印九九乘法表:
package mainimport \"fmt\"//for循环配合goto打印九九乘法表func main() {for m := 1; m < 10; m++ {n := 1LOOP:if n <= m {fmt.Printf(\"%dx%d=%d \", n, m, m*n)n++goto LOOP} else {fmt.Println(\"\")}n++}}