文章目录

  • 1. 循环语句
  • 2. for 循环
    • (1) 语法
    • (2) for语句执行过程
  • 3. 循环嵌套
  • 4. 循环控制
    • (1) break
    • (2) continue
    • (3) goto
  • 5. 循环语句 range (for range 实现迭代器)
    • (1)语法
    • (2)选择性接收值
    • (3)range 会复制值对象
    • (4)for 和 for range 的区别
  • 参考链接

1. 循环语句

Go语言中只有 for 循环。
Go中的 for 循环可以实现其它语言中的 for、while循环和遍历迭代。


2. for 循环

for 循环是一个循环控制结构,可以执行指定次数的循环。

(1) 语法

Go 语言的 For 循环有 4 种形式,只有其中的一种使用分号。

和 C 语言的 for 一样:

for init; condition; post { }

和 C 的 while 一样:

for condition { }

和 C 的 for( ; ; ) 一样:

//无限循环  相当于 for true {}
for { }

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:
for range很重要,将在 5 中详细讲解。

for key, value := range oldMap {newMap[key] = value
}

init: 一般为赋值表达式,给控制变量赋初值;
condition: 关系表达式或逻辑表达式,循环控制条件;
post: 一般为赋值表达式,给控制变量增量或减量。

(2) for语句执行过程

1、先对表达式 init 赋初值;

2、判别赋值表达式 init 是否满足给定条件 condition,若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,判别 condition;若 condition 的值为假,不满足条件,就终止for循环。


3. 循环嵌套

Go 语言允许用户在循环内使用循环:

for [condition |  ( init; condition; increment ) | Range]
{for [condition |  ( init; condition; increment ) | Range]{statement(s);}statement(s);
}

实例:使用循环嵌套来输出 2 到 100 间的素数

package mainimport "fmt"func main() {/* 定义局部变量 */var i, j intfor i = 2; i < 100; i++ {for j = 2; j <= (i / j); j++ {if i%j == 0 {break // 如果发现因子,则不是素数}}if j > (i / j) {fmt.Printf("%d  是素数\n", i)}}
}

输出结果:

2  是素数
3  是素数
5  是素数
7  是素数
11  是素数
13  是素数
17  是素数
19  是素数
23  是素数
29  是素数
31  是素数
37  是素数
41  是素数
43  是素数
47  是素数
53  是素数
59  是素数
61  是素数
67  是素数
71  是素数
73  是素数
79  是素数
83  是素数
89  是素数
97  是素数

4. 循环控制

循环控制语句可以控制循环体内语句的执行过程。

GO 语言支持以下几种循环控制语句:

  1. 这三个语句都可以配合标签(label)使用
  2. 标签名区分大小写,定义以后若不使用会造成编译错误
  3. continue、break配合标签(label)可用于多层循环跳出
  4. goto是调整执行位置,与continue、break配合标签(label)的结果并不相同

(1) break

break 语句用途:

  1. 用于循环语句中跳出循环,并开始执行循环之后的语句。
  2. break 在 switch(开关语句)中在执行一条 case 后跳出语句的作用。
  3. 在多重循环中,可以用标号 label 标出想 break 的循环。

多重循环时,使用标记和不使用标记的区别:

package mainimport "fmt"func main() {// 不使用标记fmt.Println("---- break ----")for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)break}}// 使用标记fmt.Println("---- break label ----")
re:   //re是一个标记for i := 1; i <= 3; i++ {fmt.Printf("i: %d\n", i)for i2 := 11; i2 <= 13; i2++ {fmt.Printf("i2: %d\n", i2)break re}}
}

(2) continue

continue 语句用途:

  1. continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。
  2. for 循环中,执行 continue 语句会触发 for 增量语句 increment 的执行。
  3. 在多重循环中,可以用标号 label 标出想 continue 的循环。

(3) goto

goto语句用途:

  1. Go 语言的 goto 语句可以无条件地转移到过程中指定的行。
  2. goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

但是,在结构化程序设计中一般 不主张 使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

goto 语法格式如下:

goto label;
..
.
label: statement;

5. 循环语句 range (for range 实现迭代器)

(1)语法

Golang range 类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {newMap[key] = value
}

(2)选择性接收值

可只设置一个接收器忽略 range 返回的第二个值,或使用 “_” 这个特殊变量忽略第一个返回值。没有接收器就是忽略全部返回值。

package mainfunc main() {s := "abc"// 忽略 2nd value,支持 string/array/slice/map。for i := range s {println(s[i])}// 忽略 index。for _, c := range s {println(c)}// 忽略全部返回值,仅迭代。for range s {}m := map[string]int{"a": 1, "b": 2}// 返回 (key, value)。for k, v := range m {println(k, v)}
}

输出结果:

97
98
99
97
98
99
a 1
b 2

(3)range 会复制值对象

package mainimport "fmt"func main() {a := [3]int{0, 1, 2}for i, v := range a { // range复制数组a。index、value 都是从复制品中取出。if i == 0 { // 我们先修改原数组。a[1], a[2] = 999, 999fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。}a[i] = v + 100 // range 使用复制品中取出的 value 修改原数组。}fmt.Println(a)
}

输出结果:

[0 999 999]
[100 101 102]  //而不是[100 1099 1099]

建议改用引用类型,其底层数据不会被复制。

package mainfunc main() {s := []int{1, 2, 3, 4, 5}for i, v := range s { // s是切片,一种引用类型。range复制slice的struct:{ pointer, len, cap }。if i == 0 {s = s[:3]  // 对 slice 的修改,不会影响 range。s[2] = 100 // 对底层数据的修改。}println(i, v)}
}

输出结果:

0 1
1 2
2 100
3 4
4 5

另外两种引用类型 map、channel 是指针包装,而不像 slice 是 struct。

(4)for 和 for range 的区别

它们的区别主要是使用场景不同。

for可以:

  • 遍历array和slice

  • 遍历key为整型递增的map

  • 遍历string

for range可以完成所有for可以做的事情,却能做到for不能做的,包括

  • 遍历key为string类型的map并同时获取key和value

  • 遍历channel


参考链接

  1. Go 语言循环语句

【Go】Go 语言的循环语句: for、break、continue、goto、range相关推荐

  1. Shell教程(四):条件语句、循环语句、break/continue

    在编写shell脚本,有可能是一种情况,当你需要采取一个路径两条路径.所以,需要利用条件语句,让程序作出正确的决策和执行正确的动作. UNIX Shell支持条件语句,从而根据不同的条件下执行不同的操 ...

  2. php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...

    php 与 JavaScript 有很多相似的地方: for循环中 也有两个相同: 只是 php 比 js 多了一个 exit , 其他用法一样: for($i =1;$i<11;$i++){ ...

  3. 重学JavaSE 第4章 : 顺序结构、分支语句、循环结构、break, continue, return区别

    文章目录 一. 程序流程控概述 二. 顺序结构 三.分支语句 2.1.分支语句1:if-else结构 2.1.1.输入语句 2.2. 分支语句2:switch-case结构 四.循环结构 4.1.fo ...

  4. 5-12 Python条件语句、循环语句、While循环语句、break语句、continue语句、pass语句

    5Python条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和 ...

  5. C语言进阶——循环语句缺陷分析

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...

  6. c++语言while循环,c++ c语言while 循环语句入门基础教程

    c++ c语言while 循环语句入门基础教程 我们来看While 循环语句,它跟 For 循环区别在于,For 循环一般知道循环次数,在第一行里头就指明了,而while循环一般不知道循环次数,下面我 ...

  7. R语言使用循环语句一次性画出多幅图

    R语言使用循环语句一次性画出多幅图 首先加载包,patchwork用来一个界面展示多幅图 具体的可以看这篇文章 library(ggplot2) library(patchwork) 以数据iris为 ...

  8. c语言循环语句相关摘要,C语言中循环语句的应用研究

    为了帮助初学者尽快掌握C语言的循环语句,通过实例较详细的分析了循环语句的结构.功能和应用方法,以便读者能在实际应用中能够合理地选择循环语句,编出满足需要的程序来. . 26 0 价值工程 C语言中循环 ...

  9. C语言 for循环语句

    c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句.本文主要介绍C语言 for循环语句. 原文 ...

  10. R语言for循环语句编程:for循环遍历向量内容并修改向量内容

    R语言for循环语句编程:for循环遍历向量内容并修改向量内容 目录 R语言for循环语句编程:for循环遍历向量内容并修改向量内容

最新文章

  1. 2015微信商业化正式启幕 为企业开启O2O主阵地
  2. js 空数组是true还是false
  3. OpenCV区域提取之利用Rect提取在源代码中预先定义好的区域
  4. 他因为泼了李彦宏一瓶水,成功圈粉无数,成为「网红」
  5. _新款福特F-150底价直售柔美线条硬朗风
  6. python简单工厂模式_简单工厂模式-python语言实现
  7. 数据库系统原理(第四章:SQL与关系数据库基本操作 )
  8. 变速后没有声音_问答 | 现代朗动at,启动后怠速不稳,热车后正常,是什么问题?...
  9. c语言成绩管理系统开题报告,学生信息管理系统,开题报告(共篇).doc
  10. NBA球星杜兰特之前投资Coinbse目前已获利达61.5倍
  11. PMP考试中关于应急准备金和管理应急准备金的总结
  12. 2022-01-28总结 CSS复合选择器
  13. 在应用中集成科大讯飞的语音识别技术
  14. 定义一个内核panic问题
  15. android graphview使用与感受
  16. PPT转图片/PDF-实用干货
  17. php 获取当前、两个月之前的日期
  18. php 安全禁止函数,禁用危险函数-PHP安全
  19. 计算机ms高级应用科目一 科目二考什么,科目一、科目二、科目三、科目四都考什么?全都在这儿了!...
  20. 可以实现图片编辑修改文字app有哪些?这三款工具很实用

热门文章

  1. 基于SQL企业采购管理系统设计-VB
  2. 服务器physx性能测试,PhysX有多吃性能?
  3. linux下sed正则表达式匹配批量替换文件中的内容
  4. 朋友发来的一首很好听的歌
  5. 软件测试工程师的前景!
  6. java 学生管理系统
  7. JPA使用@Modifying踩坑记录
  8. Orchard基本概念快速理解
  9. 第二届中国抗衰老化妆品产业发展论坛暨国粹国妆品牌与文化交流会在京召开
  10. 优动漫PAINT中实用的小功能——网点纸化