与多数语言不同的是,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 j := 0; j < 5; j++ {
for i := 0; i < 10; i++ {
if i > 5 {
break JLoop
}
fmt.Println(i)
}
}
JLoop:
// ...
上述代码中,break 语句终止的是 JLoop 标签处的外层循环。
初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。
初始语句可以被忽略,但是初始语句之后的分号必须要写,代码如下:
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
这段代码将 step 放在 for 的前面进行初始化,for 中没有初始语句,此时 step 的作用域就比在初始语句中声明 step 要大。
每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。
下面代码忽略条件表达式,但是保留结束语句,代码如下:
var i int
for ; ; i++ {
if i > 10 {
break
}
}
代码说明如下:
上面的代码还可以改写为更美观的写法,代码如下:
var i int
for {
if i > 10 {
break
}
i++
}
代码说明如下:
无限循环在收发处理中较为常见,但需要无限循环有可控的退出方式来结束循环。
在上面代码的基础上进一步简化代码,将 if 判断整合到 for 中,变为下面的代码:
var i int
for i <= 10 {
i++
}
在代码第 3 行中,将之前使用 if i>10{} 判断的表达式进行取反,变为判断 i 小于等于 10 时持续进行循环。
上面这段代码其实类似于其他编程语言中的 while,在 while 后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。
在结束每次循环前执行的语句,如果循环被 break、goto、return、panic 等语句强制退出,结束语句不会被执行。