在程序中重复执行某些语句。
以下为大多编程语言循环程序的流程图:
Go 语言提供了以下几种类型循环处理语句:
循环类型 | 描述 |
---|---|
for 循环 | 重复执行语句块 |
循环嵌套 | 在 for 循环中嵌套一个或多个 for 循环 |
循环控制语句
循环控制语句可以控制循环体内语句的执行过程。
GO 语言支持以下几种循环控制语句:
控制语句 | 描述 |
---|---|
break 语句 | 经常用于中断当前 for 循环或跳出 switch 语句 |
continue 语句 | 跳过当前循环的剩余语句,然后继续进行下一轮循环。 |
goto 语句 | 将控制转移到被标记的语句。 |
无限循环
如果循环中条件语句永远不为 false 则会进行无限循环,我们可以通过 for 循环语句中只设置一个条件表达式来执行无限循环:
package main
import "fmt"
func main() {
for true {
fmt.Printf("这是无限循环。\n");
}
}
Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和 C++ 中非常接近:
- 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 中的条件表达式——控制是否循环的开关
每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。
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 等语句强制退出,结束语句不会被执行。
for循环
// 如同C的for循环
for init; condition; post { }
// 如同C的while循环
for condition { }
// 如同C的for(;;)循环
for { }
简短声明能让我们更容易在循环中声明下标变量:
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
若你想遍历数组、切片、字符串或者映射,或从信道中读取消息, range
子句能够帮你轻松实现循环。
for key, value := range oldMap {
newMap[key] = value
}
若你只需要该遍历中的第一个项(键或下标),去掉第二个就行了:
for key := range m {
if key.expired() {
delete(m, key)
}
}
若你只需要该遍历中的第二个项(值),请使用空白标识符,即下划线来丢弃第一个值:
sum := 0
for _, value := range array {
sum += value
}
空白标识符还有多种用法,它会在后面的小节中描述。
对于字符串,range
能够提供更多便利。它能通过解析UTF-8, 将每个独立的Unicode码点分离出来。错误的编码将占用一个字节,并以符文U+FFFD来代替。 (名称“符文”和内建类型 rune
是Go对单个Unicode码点的成称谓。 详情见语言规范)。循环
for pos, char := range "日本\x80語" { // \x80 是个非法的UTF-8编码
fmt.Printf("字符 %#U 始于字节位置 %d\n", char, pos)
}
将打印
字符 U+65E5 '日' 始于字节位置 0
字符 U+672C '本' 始于字节位置 3
字符 U+FFFD '�' 始于字节位置 6
字符 U+8A9E '語' 始于字节位置 7
最后,Go没有逗号操作符,而 ++
和 --
为语句而非表达式。 因此,若你想要在 for
中使用多个变量,应采用平行赋值的方式 (因为它会拒绝 ++
和 --
).
// 反转 a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}
评论列表(0条)