一文熟悉 Go 的循环结构 —— for 循环
创始人
2024-02-21 12:00:21
0

哈喽大家好,我是陈明勇,今天分享的知识是 Go 的循环结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

耐心和持久胜过激烈和狂热。

循环结构

循循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。有的编程语言,包含两种循环结构,一种是 for 循环,另一种是 while 循环,而在 Go 里面,有且只有一种循环 —— for 循环。接下来看一个示例:

func main() {sum := 0for num := 1; num <= 10; num++ {sum += num}println(sum) // 55
}

在这里插入图片描述

上述代码实现的功能是在 1-10 之中累加求和,最后的结果为 55

  • 上图所示,for 循环分为四个部分,第一部分 num := 1 为循环前置语句,在这一部分,我们一般都会定义一些变量,这些变量被使用于第二部分第三部分里。
  • 第二部分是条件判断表达式,也就是布尔表达式,多条件可以使用逻辑操作符进行连接。此部分的作用是判定循环是否继续下去,图中循环不终止的条件为 num <= 10。只要条件成立,就会去执行第三部分.
  • 第三部分为循环体,只要循环不终止,程序就会重复执行循环体里面的代码。上述例子中,循环体所做的事情就是累加 num 变量的值。
  • 第四部分为循环后置语句,这一部分通常会对第一部分所定义的变量进行更新,例如上述例子中,对 num 进行自增。

for 循环执行顺序是这样的:

  • 第一部分(只会执行一次)
  • 第二部分(若布尔表达式的值为 false 则终止循环,不进行第三第四部分)
  • 第三部分
  • 第四部分,然后返回第二部分继续执行。
    对于上述四个部分,除了第三部分以外,其他部分都可以省略。如果只留第三部分,那么就形成死循环,以下为示例:
    func main() {for {println("糟糕,死循环!")}
    }
    
    在一些场景下,我们会利用死循环去做一些特定的事,但是最终还是要跳出死循环的。如何跳出死循环,就涉及到接下来要讲的关键字 break

for-range

除了上面所讲的普通 for 循环的形式,Go 里面还支持一种 for 循环,为 for-range 循环,这是一种什么循环形式呢?我们来看看例子:

import "fmt"func main() {nums := [4]int{1, 2, 3, 4}for i := 0; i < len(nums); i++ {fmt.Printf("下标:%d,元素:%d\n", i, nums[i])}
}

上述代码,在循环前置语句中,声明数组的下标,然后循环体通过下标值打印数组的元素,我们来看看使用 for-range 的代码实现是怎么样的:

import "fmt"func main() {nums := [4]int{1, 2, 3, 4}for i, num := range nums {fmt.Printf("下标:%d,元素:%d\n", i, num)}
}

与普通 for 循环相比,for-range 的形式代码量少了很多,除了循环体保留了下来,其余部分都融入到了 for-range 的语义里。上述代码中,变量 i 为数组的下标索引,num 为数组中的元素值。如果我们所关注的只是数组的下标索引或者元素值,可以进行以下改造:

  • 只关注下标索引
    import "fmt"func main() {nums := [4]int{1, 2, 3, 4}for i := range nums {fmt.Printf("下标:%d\n", i)}
    }
    仅仅定义一个 i 变量。
  • 只关注元素值
    import "fmt"func main() {nums := [4]int{1, 2, 3, 4}for _, num := range nums {fmt.Printf("元素值:%d\n", num)}
    }
    索引位置使用 _ 代替,表示忽略下标索引的接收。
  • 下标索引和元素值都不关注
    package mainfunc main() {nums := [4]int{1, 2, 3, 4}for range nums {}
    }

break 和 continue 关键字

break 和 continue 关键字用于控制 for 循环的代码流程,且只对最近的 for 循环有效(多层循环的情况下)。

  • break
    退出 for 循环,循环体后续代码不再执行。
  • continue
    终止本轮循环,循环体后续代码不再执行,进入下一轮循环。

示例

  • 循环遍历数组,如果在数组内找到元素值 6,则退出循环。
    func main() {nums := [5]int{1, 2, 6, 3, 4}for _, num := range nums {if num == 6 {break}println("元素:", num)}
    }
    执行结果:
    元素: 1
    元素: 2
    
    根据执行结果可知,遍历数组到元素 6 的时候,使用 break 关键字,循环就终止了,后面的元素 34 没有被打印出来。前面所提到的死循环也可以使用 break 关键字跳出循环。
  • 循环遍历数组,只打印奇数,忽略偶数。
    func main() {nums := [5]int{1, 2, 6, 3, 4}for _, num := range nums {if num%2 == 0 {continue}println("元素:", num)}
    }
    
    执行结果:
    元素: 1
    元素: 3
    
    遇到偶数元素,就使用关键字 continue 结束本轮循环,开始下一轮循环。

label

Go 语言中,label 语句的作用是标记跳转的目标。示例说明:
遍历二维数组,找到元素 3 后结束跳出整个循环。

func main() {nums := [][]int{{1, 2},{3, 4},{5, 6},}for i := 0; i < len(nums); i++ {println("第", i+1, "轮:")for j := 0; j < len(nums[i]); j++ {if nums[i][j] == 3 {break}println("元素值:", nums[i][j])}}
}

执行结果:

第 1 轮:
元素值: 1
元素值: 2
第 2 轮:
第 3 轮:
元素值: 5
元素值: 6

外层循环一共要循环三轮,根据结果可知,使用 break 关键字,并没有跳出整个循环。在第二轮循环之后,进入内层循环,找到元素 4break 关键字只终止了内层循环,外层循环的第三轮还会继续执行,这并不是我们想要的结果。要想达到目标结果,需要结合 label 语句实现:

func main() {nums := [][]int{{1, 2},{3, 4},{5, 6},}
outerLoop:for i := 0; i < len(nums); i++ {println("第", i+1, "轮:")for j := 0; j < len(nums[i]); j++ {if nums[i][j] == 3 {break outerLoop}println("元素值:", nums[i][j])}}
}

执行结果:

第 1 轮:
元素值: 1
元素值: 2
第 2 轮:

在第一层循环前面,使用 label 语句,用 outerLoop 进行标记,然后在 break 关键字后面加上这个标记,就能实现跳出整个循环。

小结

本文首先介绍了 Go 里面的普通 for 循环,然后由普通 for 循环引出了 for-range 循环,对于数组、切片、Map 等复合数据结构,遍历方式使用 for-range 的形式会更好,特殊的复合数据类型如 Map,遍历方式也只能用 for-range 的形式。本文还提到了 breakcontinuelabel 关键字,通过案例介绍了它们的使用场景。

相关内容

热门资讯

我发现了蚂蚁的秘密作文 我发现了蚂蚁的秘密作文(精选73篇)  在日常学习、工作和生活中,大家都接触过作文吧,借助作文可以提...
迪斯尼儿歌歌词:蛤蜊哟,淡菜 迪斯尼儿歌歌词:蛤蜊哟,淡菜  蛤蜊哟,淡菜  COCKLES AND MUSSELS  蛤蜊哟,淡...
优秀作文欣赏 优秀作文欣赏(精选10篇)  在日常学习、工作或生活中,许多人都写过作文吧,作文是由文字组成,经过人...
篮球王子作文800字 篮球王子作文800字  天空依然万里无云,从一家医院的手术室传出了一阵哭声,一个胖嘟嘟的小男孩顺利地...
三国人物的歇后语 三国人物有关的歇后语(精选80条)  歇后语是中国劳动人民自古以来在生活实践中创造的一种特殊语言形式...
献给母亲的诗 献给母亲的一首诗  在学习、工作乃至生活中,大家一定都接触过一些使用较为普遍的诗歌吧,诗歌是一种抒情...
黑夜里天空是愤怒的拳头作文 黑夜里天空是愤怒的拳头作文  在学习、工作或生活中,大家都不可避免地要接触到作文吧,作文是一种言语活...
他的父亲作文 他的父亲作文(5篇)  无论是身处学校还是步入社会,大家都有写作文的经历,对作文很是熟悉吧,作文是通...
向阳花木易逢春的作文 向阳花木易逢春的作文(通用26篇)  在学习、工作乃至生活中,大家总少不了接触作文吧,作文一定要做到...
以五一为话题的作文 以五一为话题的作文(精选26篇)  在学习、工作或生活中,大家都经常看到作文的身影吧,作文是经过人的...
责任与担当作文 责任与担当作文800字(精选25篇)  在学习、工作或生活中,大家都接触过作文吧,借助作文人们可以反...
离职申请书的离职原因 离职申请书的离职原因5篇  在经济飞速发展、人们往来越来越密切的今天,申请书使用的情况越来越多,申请...
月光下的村庄铁蛋作文 月光下的村庄铁蛋作文(精选25篇)  在日常的学习、工作、生活中,大家都尝试过写作文吧,作文一定要做...
优秀作文音乐人生 优秀作文音乐人生  音乐,是一种快乐;音乐,是一种享受;音乐,是我们童年的好朋友;音乐,也是我的人生...
动漫《镇魂街》插曲歌词 动漫《镇魂街》插曲歌词  闪耀 - 南征北战  (动漫《镇魂街》插曲)  作词:南征北战  作曲:南...
美好的旅行作文 美好的旅行作文  在日复一日的学习、工作或生活中,大家都不可避免地会接触到作文吧,作文是从内部言语向...
「励志故事」历数那些80后C... 「励志故事」历数那些80后CEO的校园生活  【马克·扎克伯格的校园生活】  年龄:26岁  净资产...
中考以奖品为话题作文600字 中考以奖品为话题作文600字(通用17篇)  在日常生活或是工作学习中,大家都跟作文打过交道吧,写作...
留一点微笑给自己作文 留一点微笑给自己作文600字(通用28篇)  在日常生活或是工作学习中,大家都跟作文打过交道吧,写作...
军训必唱歌曲《弹起我心爱的土... 军训必唱歌曲《弹起我心爱的土琵琶》歌词   《弹起我心爱的土琵琶》  西边的太阳快要落山了  微山湖...