Go语言基础之流程控制for循环
一、for(循环结构)
Go 语言中的所有循环类型均可以使用for
关键字来完成。
for循环的基本格式如下:
for 初始语句;条件表达式;结束语句{
循环体语句
}
初始化语句只执行一次。循环初始化后,将检查循环条件。如果条件的计算结果为 true
,则 {}
内的循环体将执行,接着执行 结束语。结束语句将在每次成功循环迭代后执行。在执行 结束语句后,条件将被再次检查。如果为 true
, 则循环将继续执行,否则 for 循环将终止。(译注:这是典型的 for 循环三个表达式,第一个为初始化表达式或赋值语句;第二个为循环条件判定表达式;第三个为循环变量修正表达式,即此处的 结束语句)
这三个组成部分,即初始化,条件和 结束语句都是可选的。
条件表达式返回true
时循环体不停地进行循环,直到条件表达式返回false
时自动退出循环。
func forDemo() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
for循环的初始语句可以被忽略,但是初始语句后的分号必须要写,例如:
func forDemo2() {
i := 0
for ; i < 10; i++ {
fmt.Println(i)
}
b := 1
for ; b < 10; {
fmt.Println(" 第二种方式 全局作用局:", b)
b++
}
}
for循环的初始语句和结束语句都可以省略,例如:
func forDemo3() {
i := 0
for i < 10 {
fmt.Println(i)
i++
}
}
这种写法类似于其他编程语言中的while
,在while
后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。
二、无限循环
for {
循环体语句
}
# 方式一
for {
fmt.Println("sss")
}
# 方式二
for ; ; {
fmt.Println("sss")
}
# 方式三
for true {
// fmt.Println("sss")
//}
// break 退出
for {
fmt.Println("sss")
break
}
// continue
for {
fmt.Println("sss")
continue
}
for循环可以通过break
、goto
、return
、panic
语句强制退出循环。
三、for range(键值循环)
Go语言中可以使用for range
遍历数组、切片、字符串、map 及通道(channel)。 通过for range
遍历的返回值有以下规律:
- 数组、切片、字符串返回索引和值。
- map返回键和值。
- 通道(channel)只返回通道内的值。
// 循环数组
names:=[4]string{"张三","李四","王五"}
for i,v:=range names{
fmt.Println(i,v)
}
1 张三
2 李四
3 王五
// 循环切片
names:=[]string{"张三","李四","王五"}
for i,v:=range names{
fmt.Println(i,v)
}
1 张三
2 李四
3 王五
// 循环字符串
for i,v:=range "hello你好"{
fmt.Printf("%d %q\n",i,v)
}
0 'h'
1 'e'
2 'l'
3 'l'
4 'o'
5 '你'
8 '好'
// map返回键和值
ages:=map[string]int{
"张三":20,
"李四":30,
}
for i,v:=range ages{
fmt.Println(i,v)
}
李四 30
张三 20
四、break和continue
break
break
语句用于在完成正常执行之前突然终止 for 循环,之后程序将会在 for 循环下一行代码开始执行。
让我们写一个从 1 打印到 5 并且使用 break
跳出循环的程序。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i > 5 {
break //loop is terminated if i > 5
}
fmt.Printf("%d ", i)
}
fmt.Printf("\nline after for loop")
}
在上面的程序中,在循环过程中 i 的值会被判断。如果 i 的值大于 5 然后 break
语句就会执行,循环就会被终止。打印语句会在 for
循环结束后执行,上面程序会输出为
1 2 3 4 5
line after for loop
continue
continue
语句用来跳出 for
循环中当前循环。在 continue
语句后的所有的 for
循环语句都不会在本次循环中执行。循环体会在一下次循环中继续执行。
让我们写一个打印出 1 到 10 并且使用 continue
的程序。
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue
}
fmt.Printf("%d ", i)
}
}
在上面的程序中,这行代码 if i%2==0
会判断 i 除以 2 的余数是不是 0,如果是 0,这个数字就是偶数然后执行 continue
语句,从而控制程序进入下一个循环。因此在 continue
后面的打印语句不会被调用而程序会进入一下个循环。上面程序会输出 1 3 5 7 9
。
五、总结
- for分支的基本结构
for 初始化; 条件; 表达式{
逻辑代码
}
- for分支几种方式的演变,省略初始化,省略初始化和表达式,while实现
- 死循环方式的演变
- brak和continue
for 初始化;条件;自增{
内容
初始化的内容只能再内部使用
}
for ;条件;自增{
省略初始化
}
for ;条件;{
省略初始化
省略自增
}
for 条件{
省略初始化
省略自增
去掉两个分号
等同于while
}
for {
省略初始化
省略自增
去掉两个分号
去掉条件,就是死循环
}