4.2 Go语言循环结构 - Go语言中文社区

4.2 Go语言循环结构


与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和 C++ 中非常接近:

  1. sum := 0
  2. for i := 0; i < 10; i++ {
  3. sum += i
  4. }

可以看到比较大的一个不同在于 for 后面的条件表达式不需要用圆括号()括起来,Go语言还进一步考虑到无限循环的场景,让开发者不用写无聊的 for(;;){}和do{} while(1);,而直接简化为如下的写法:

  1. sum := 0
  2. for {
  3. sum++
  4. if sum > 100 {
  5. break
  6. }
  7. }

使用循环语句时,需要注意的有以下几点:

  • 左花括号{必须与 for 处于同一行。
  • Go语言中的 for 循环与C语言一样,都允许在循环条件中定义和初始化变量,唯一的区别是,Go语言不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量。

Go语言的 for 循环同样支持 continuebreak 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环,如下例:

  1. for j := 0; j < 5; j++ {
  2. for i := 0; i < 10; i++ {
  3. if i > 5 {
  4. break JLoop
  5. }
  6. fmt.Println(i)
  7. }
  8. }
  9. JLoop:
  10. // ...

上述代码中,break 语句终止的是 JLoop 标签处的外层循环。

for 中的初始语句——开始循环时执行的语句

初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。

初始语句可以被忽略,但是初始语句之后的分号必须要写,代码如下:

  1. step := 2
  2. for ; step > 0; step-- {
  3. fmt.Println(step)
  4. }

这段代码将 step 放在 for 的前面进行初始化,for 中没有初始语句,此时 step 的作用域就比在初始语句中声明 step 要大。

for 中的条件表达式——控制是否循环的开关

每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。

1) 结束循环时带可执行语句的无限循环

下面代码忽略条件表达式,但是保留结束语句,代码如下:

  1. var i int
  2. for ; ; i++ {
  3. if i > 10 {
  4. break
  5. }
  6. }

代码说明如下:

  • 第 3 行,无须设置 i 的初始值,因此忽略 for 的初始语句,两个分号之间是条件表达式,也被忽略,此时循环会一直持续下去,for 的结束语句为 i++,每次结束循环前都会调用。
  • 第 5 行,判断 i 大于 10 时,通过 break 语句跳出 for 循环到第 9 行。
2) 无限循环

上面的代码还可以改写为更美观的写法,代码如下:

  1. var i int
  2. for {
  3. if i > 10 {
  4. break
  5. }
  6. i++
  7. }

代码说明如下:

  • 第 3 行,忽略 for 的所有语句,此时 for 执行无限循环。
  • 第 9 行,将 i++ 从 for 的结束语句放置到函数体的末尾是等效的,这样编写的代码更具有可读性。

无限循环在收发处理中较为常见,但需要无限循环有可控的退出方式来结束循环。

3) 只有一个循环条件的循环

在上面代码的基础上进一步简化代码,将 if 判断整合到 for 中,变为下面的代码:

  1. var i int
  2. for i <= 10 {
  3. i++
  4. }

在代码第 3 行中,将之前使用if i>10{}判断的表达式进行取反,变为判断 i 小于等于 10 时持续进行循环。

上面这段代码其实类似于其他编程语言中的 while,在 while 后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。

for 中的结束语句——每次循环结束时执行的语句

在结束每次循环前执行的语句,如果循环被 breakgotoreturnpanic 等语句强制退出,结束语句不会被执行。

版权声明:本教程内容除了本站原创内容外,还有来源自C语言编程网,博客园,CSDN等技术站点,感谢相关博主原创文章,转载请附上原文出处链接和本声明。
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 阅读 ( 612 )
  • 分类:Go

0 条评论

官方社群

GO教程

猜你喜欢