与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和[C++](http://c.biancheng.net/cplus/)中非常接近:
~~~
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
~~~
可以看到比较大的一个不同在于 for 后面的条件表达式不需要用圆括号`()`括起来,Go语言还进一步考虑到无限循环的场景,让开发者不用写无聊的 `for(;;){}`和`do{} while(1);`,而直接简化为如下的写法:
~~~
sum := 0
for {
sum++
if sum > 100 {
break
}
}
~~~
使用循环语句时,需要注意的有以下几点:
* 左花括号`{`必须与 for 处于同一行。
* Go语言中的 for 循环与C语言一样,都允许在循环条件中定义和初始化变量,唯一的区别是,**Go语言不支持以逗号为间隔的多个赋值语句**,必须使用平行赋值的方式来初始化多个变量。
* Go语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环,如下例:
~~~
for j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop
}
fmt.Println(i)
}
}
JLoop:
// ...
~~~
上述代码中,break 语句终止的是 JLoop 标签处的外层循环。
## for 中的初始语句——开始循环时执行的语句
**初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化**,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。
初始语句可以被忽略,但是初始语句之后的分号必须要写,代码如下:
~~~
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
~~~
这段代码将 step 放在 for 的前面进行初始化,for 中没有初始语句,此时 step 的作用域就比在初始语句中声明 step 要大。
## for 中的条件表达式——控制是否循环的开关
#### 1) 结束循环时带可执行语句的无限循环
下面代码忽略条件表达式,但是保留结束语句,代码如下:
~~~
var i int
for ; ; i++ {
if i > 10 {
break
}
}
~~~
代码说明如下:
* 第 3 行,无须设置 i 的初始值,因此忽略 for 的初始语句,两个分号之间是条件表达式,也被忽略,此时循环会一直持续下去,for 的结束语句为 i++,每次结束循环前都会调用。
* 第 5 行,判断 i 大于 10 时,通过 break 语句跳出 for 循环到第 9 行。
#### 2) 无限循环
上面的代码还可以改写为更美观的写法,代码如下:
~~~
var i int
for {
if i > 10 {
break
}
i++
}
~~~
代码说明如下:
* 第 3 行,忽略 for 的所有语句,此时 for 执行无限循环。
* 第 9 行,将 i++ 从 for 的结束语句放置到函数体的末尾是等效的,这样编写的代码更具有可读性。
无限循环在收发处理中较为常见,但需要无限循环有可控的退出方式来结束循环。
#### 3) 只有一个循环条件的循环
在上面代码的基础上进一步简化代码,将 if 判断整合到 for 中,变为下面的代码:
~~~
var i int
for i <= 10 {
i++
}
~~~
在代码第 3 行中,将之前使用`if i>10{}`判断的表达式进行取反,变为判断 i 小于等于 10 时持续进行循环。
上面这段代码其实类似于其他编程语言中的 while,在 while 后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。
## for 中的结束语句——每次循环结束时执行的语句
在结束每次循环前执行的语句,如果循环被 break、goto、return、panic 等语句强制退出,结束语句不会被执行。
- 1.Go语言前景
- 2.Go语言环境搭建
- 3.Go语言的基本语法
- 3.1变量
- 3.1.1变量声明
- 3.1.2变量初始化
- 3.1.3多个变量同时赋值
- 3.1.4匿名变量
- 3.1.5变量的作用域
- 3.1.6整型
- 3.1.7浮点类型
- 3.1.8复数
- 3.1.9bool类型
- 3.1.10字符串
- 3.1.11字符类型
- 3.1.12类型转换
- 3.2常量
- 3.1.1const关键字
- 3.2.2模拟枚举
- 4.Go语言的流程控制
- 4.2循环结构
- 4.3键值循环
- 4.4switch语句
- 4.5goto语句
- 4.6break语句
- 4.7continue语句
- 5.Go语言的函数
- 5.1函数声明
- 5.2函数变量
- 5.3函数类型实现接口
- 5.4闭包
- 5.5可变参数
- 5.6defer(延迟执行语句)
- 5.7处理运行时错误
- 5.8宕机(panic)
- 5.9宕机恢复(recover)
- 5.10Test功能测试函数
- 6.Go语言的内置容器
- 6.1数组
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go语言的结构体
- 8.Go语言的接口
- 9.Go语言的常用内置包
- 10.Go语言的并发
- 11.Go语言的文件I/O操作
- 12.Go语言的网络编程
- 13.Go语言的反射
- 14.Go语言的数据库编程
- 15.Go语言密码学算法
- 16.Go语言的gin框架
- 17.Go语言的网络爬虫
- 18.Go语言的编译和工具链