Go语言只有for循环这一种循环结构。
for expression1; expression2; expression3 {
//…
}
expression1、expression2、expression3都是表达式,其中expression1和expression3是变量声明或者函数调用返回值之类的。
1)expression1:在第一次循环开始之前调用;
2)expression2:用来条件判断,每轮迭代开始前被求值;
3)expression3:每轮循环结束之时调用;
初始化语句一般是一个短变量声明,这里声明的变量仅在整个 for 循环语句可见。
如果条件表达式的值变为 false,那么迭代将终止。
sum := 0
for index := 0; index < 10; index++ {
sum += index
}
fmt.Println(“sum is equal to “, sum)
注意:不像 C,Java,或者 Javascript 等其他语言,Go语言中的for循环语句的三个部分不需要用括号括起来,但循环体必须用 { } 括起来。
基于计数器的迭代
for 初始化语句; 条件语句; 修饰语句 {
//循环语句
}
我们用for循环来计算10以内正整数的和。
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum) // 45
这三部分组成的循环的头部,它们之间使用分号 ; 相隔,但并不需要括号 () 将它们括起来。例如:
for (i = 0; i < 10; i++) { } //非法代码!
和 if-else 语句类似,for循环中左花括号 { 必须和 for 语句在同一行,计数器的生命周期在遇到右花括号 } 时便终止。一般习惯使用 i、j、z 或 ix 等较短的名称命名计数器。
基于条件判断的for循环
有些时候如果我们忽略expression1和expression3:
sum:=1
for ; sum <1000; {
sum += sum
}
其中“;”也可以省略,那么就变成如下的代码了,是不是似曾相识?对,这就是while的功能。
for 条件语句 {}
sum := 1
for sum < 1000 {
sum += sum
}
多个赋值操作
进行多个赋值操作,可以使用平行赋值:i, j = i+1, j-1
for-range 结构
这是 Go 语言特有的一种的迭代结构,它一般用来遍历数组,slice和map等集合。
我们用range来遍历一个数组,以下代码会打印出每个值的序号和对应的值。
arr := […]int{6, 7, 8}
for i, v := range arr {
fmt.Println(i, v)
}
由于 Go 支持 “多值返回”,而对于“声明而未被调用”的变量,编译器会报错,在这种情况下,可以使用_来丢弃不需要的返回值。例如:
for _,v := range map {
fmt.Println(“map’s val:”, v)
}
无限循环
Go 语言有以下几种无限循环:
i:=0; ; i++
for { } // 常用
for ;; { }
for true { }
这些无限循环都是 for 循环的条件语句被省略了。如果 for 循环的头部没有条件语句,那么就会认为条件永远为 true。因此如果不想造成死循环,循环体内必须有相关的条件判断以确保会在某个时刻退出循环。
关键字 goto break continue
goto
可以无条件地转移到过程中指定的行。通常与条件语句配合使用,可用来实现条件转移、构成循环、跳出循环体等功能。
goto对应(标签)既可以定义在for循环前面,也可以定义在for循环后面,当跳转到标签地方时,继续执行标签下面的语句。
break
跳出当前循环;
continue
跳过本次循环,进入下一轮循环。
当嵌套过深的时候,break可以配合标签使用,即跳转至标签所指定的位置。
for index:=10; index>0; index– {
if index ==5 {
break //或者continue
}
fmt.Println(index)
}
//break打印出来10、9、8、7、6
//continue打印出来10、9、8、7、6、4、3、2、1
break和continue还可以跟着标号,用来跳到多重循环中的外层循环。