文章目录
- 06 Go语言循环语句
- 6.1 for循环
- 6.2 for-range循环
- 6.3 循环语句嵌套
- 6.4 循环控制语句
- break语句
- continue
- goto
06 Go语言循环语句
Go语言的循环语句只有for语句,没有其他语言中的while和do-while语句。
6.1 for循环
Go语言的for循环语句有3种形式。
- 形式1:for init; condition; post {}
和C语言的for一样。 - 形式2:for condition {}
和C语言的while一样。 - 形式3:for {}
和C语言的while(true)一样。
循环语句各部分说明:
- init - 循环初始化,在循环开始之前执行。一般为赋值语句。
- condition - 循环控件条件,在每轮循环开始之前执行。一般为关系表达式或逻辑表达式。
- post - 循环后处理,在每轮循环完成之后执行。一般为赋值语句,给控制变量增量或减量。
- {} - 循环体代码块,每轮循环所执行的代码在此。
循环语句的执行过程如下:
- 如果有init部分,先执行init;如果没有则直接进入步骤2。
- 如果有condition部分,则判断condition,为真进入步骤3,为假退出循环;如果没有condition部分,则直接进入步骤3。
- 执行循环体。之后,如果有post部分,则进入步骤4,如果没有post部分,则再次进入本步骤。
- 执行post,然后再次进入步骤2
示例1:
/// 计算 1 到 10 的数字之和
package main
import "fmt"
func main() {
sum := 0
for i := 0; i <= 10; i++ {
sum += i
}
fmt.Println(sum) // 输出 55
}
示例2(没有init部分):
/// 计算 1 到 10 的数字之和
package main
import "fmt"
func main() {
sum := 1
for ; sum <= 10; {
sum += sum
}
fmt.Println(sum)
// 这样写也可以,更像 While 语句形式
for sum <= 10{
sum += sum
}
fmt.Println(sum)
}
6.2 for-range循环
Go语言支持for-range循环,可以对切片、map、数组、字符串等进行循环迭代。
package main
import "fmt"
func main() {
var hello = "hello, world!"
for idx, value := range hello {
fmt.Println(idx, value)
}
}
关于for-range循环的具体使用,等后面讲到切片、map、数组、等数据类型时再作讲解。
6.3 循环语句嵌套
循环语句的循环体中还有循环语句。
例如(打印九九乘法表):
package main
import "fmt"
func main() {
for m:=1; m < 10; m++ {
for n:=1; n <= m; n++ {
fmt.Printf("%dx%d=%d ", n, m, n*m)
}
fmt.Println("")
}
}
6.4 循环控制语句
break语句
用于语句用于终止某个语句块的执行。再循环语句中break语句用于跳出循环。
在学习switch语句的章节,也提到过break可以跳出当前switch分支,原理类似。
示例(break跳出循环):
/// 在变量 a 大于 15 的时候跳出循环:
package main
import "fmt"
func main() {
var a int = 10
for a < 20 {
fmt.Printf("a 的值为 : %d\n", a);
a++;
if a > 15 {
/* 使用 break 语句跳出循环 */
break;
}
}
}
在多层嵌套的循环语句中,break可以通过标签指明要跳出的是哪一层的循环。
示例:
package main
import "fmt"
func main() {
//label1:
for i := 0; i < 4; i++ {
label2:
for j := 0; j < 5; j++ {
if j == 2 {
//break //break默认会跳出最近的循环
//break label1;
break label2;
}
fmt.Println("j = ", j)
}
}
}
continue
continue语句用于结束本轮循环,继续执行下一轮循环。
continue语句有点像break语句,但是continue不跳出循环,而是执行下一轮循环。
continue语句出现在多层嵌套的循环语句中时,也可以通过标签指明要跳出的是哪一层的循环。
示例:
/// 在变量 a 等于 15 的时候跳过本次循环执行下一次循环:
package main
import "fmt"
func main() {
var a int = 10
/* for 循环 */
for a < 20 {
if a == 15 {
/* 跳过此次循环 */
a = a + 1;
continue;
}
fmt.Printf("a 的值为 : %d\n", a);
a++;
}
}
goto
goto语句可以无条件的转移到程序中指定的行。
goto语句通常与条件语句配合使用。可用来实现条件转移、跳出循环体等操作。
但是,在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。
示例:
package main
import "fmt"
func main() {
fmt.Println(1);
goto label1
fmt.Println(2);
fmt.Println(3);
fmt.Println(4);
label1:
fmt.Println(5);
}
// 输出结果
// 1
// 5