Go基础:for循环
1. for语法
Go中仅有for一种循环语句,没有while和do while这种语法。但是常用方式都能实现。
三种常用方式如下:
for i := 0; i < 10; i++ { } for i < 10 { // 类似于while(i < 10) {} } for { // 类似于while(true) {} break }
对于第一种方式,初始化语句i := 0仅被执行一次,初始化完成后,将检查条件语句i<10,若为true,则执行循环体,执行完循环体后,再执行后面的赋值语句i++,接着检查条件语句;若检查条件语句结果为false,则跳出循环。
2. break & continue
break语句常用于中断for循环的执行,而continue用于中断当前for循环的,立即进入下一轮循环。
func main() {for i := 0; i < 5; i++ {if i == 2 { // 当 i == 2时,跳出整个循环 break } fmt.Printf(" %d", i) } fmt.Println() for i := 0; i < 5; i++ { if i == 2 { // 当i == 2时,跳出当前轮循环 continue } fmt.Printf(" %d", i) }
}
执行结果如下:
0 1
0 1 3 4
3. for…range
for…range可完成数据迭代,支持字符串、数组、字典、切片通道类型。
其语法如下:
for index, value := range data { }
举一个例子,定义一个string切片,通过for…range遍历并打印切片内容:
func main() { data := []string{"a", "b", "c"} for index, value := range data { fmt.Println("index:", index, " value:", value) }}
执行结果:
index: 0 value: a
index: 1 value: b
index: 2 value: c
当然range可以返回单值,或者用"_"忽略。
func main() { data := []string{"a", "b", "c"} for index := range data { // 忽略value fmt.Println("index:", index) } for _, value := range data { // 忽略index fmt.Println("value:", value) }
}
4. 更多
4.1 标签
go语法中支持标签指定目标层级。
假设我们有一个需求,在二重循环中想要终止程序,一般可以定义一个flag,在外层循环中通过判断flag来决定循环是否终止。
func main() { for { flag := false // 定义一个bool变量 for { flag = true break } if flag { break } }}
我们也可以使用标签达到同样的效果:
func main() {label: // 定义一个label标签 for { for { break label // 终止外层循环 } }
}
for…rangefor…range在迭代中做的是值拷贝,举一个例子如下:
func main() { data := [3]int{10, 20, 30} for i, v := range data { // 将data复制一份 if i == 0 { data[0] += 100 data[1] += 200 data[2] += 300 } fmt.Printf("i:%d, v:%d, data[%d]:%d\n", i, v, i, data[i]) }
}
i:0, v:10, data[0]:110
i:1, v:20, data[1]:220
i:2, v:30, data[2]:330
for…range会将data复制一份,每次循环会从复制品种取出一个值赋给变量v,当i==0时,data中元素即使被改变,也不影响v的结果。再看下面这个例子,和你预期的结果一样吗?
func main() { m := make(map[string]*student, 10) stus := []student{ {name: "tom", age: 18}, {name: "Alice", age: 25}, {name: "lucy", age: 20}, } for _, stu := range stus { fmt.Printf("%p\n", &stu) m[stu.name] = &stu } for k, v := range m { fmt.Println(k, "=>", v.name) }
}
执行结果如下:
0xc000008078
0xc000008078
0xc000008078
Alice => lucy
tom => lucy
lucy => lucy
出现这样的结果的原因就是range 在迭代中会做值拷贝,会把整个结构体拷贝给当前循环空间,stu变量会被循环赋值,而stu 内存地址不改变,所以输出的三个地址是一样的.
三次拷贝的内容会在stu地址上覆盖,因此最后map中 3 个值都指向的是stu地址。
关注我的公众号
Golang猫
获取更多文章和资源。
Go基础:for循环相关推荐
- python基础 while循环练习
这篇文章主要给大家分享的是5道关于python基础 while循环练习题,无论学习什么语言,练习都是必不可少的,下面文章的练习题挺精湛的,需要的朋友可以参考一下 1. 使用while循环输出1 2 3 ...
- Python基础之循环语句
Python基础之循环语句 一.循环语句介绍 1.循环语句理解 2.循环语句示意图 二.循环语句的分类 三.循环控制语句 四.while循环 1.while死循环 2.while条件循环 五.brea ...
- python中for循环语句格式_Python基础-10循环语句
Python Python开发 Python语言 Python基础-10循环语句 10.循环语句 对于循环语句,Python仅提供了while和for两个,并未像其他编程语言一样提供for...eac ...
- java循环基础知识_Java基础知识·循环语句
掘友们,大家好呀,我是宸道. 今天要讲解的是Java基础的循环语句,虽然很基础但还是希望大家看完,就当时复习知识了,基础越牢固越好,对我们是有很大帮助的. 相关推荐 循环语句可以在满足循环条件的情况下 ...
- python基础——while循环(九九乘法表,阶乘计算器,三角形图案打印输出)
python基础--while循环(九九乘法表,阶乘计算器,三角形图案打印输出) 一.目的 本人最近在学习python的基础语法,此文章用来记录学习过程所用,本文章讲述的是while循环的一些基础实例 ...
- python循环语句画图_Python基础之循环语句用法示例【for、while循环】
本文实例讲述了Python基础之循环语句用法.分享给大家供大家参考,具体如下: while 循环 Python中while语句的一般形式: while 判断条件: statements 同样需要注意冒 ...
- JavaScript 基础语法循环案例练习
JavaScript 基础语法循环案例练习 文章目录 JavaScript 基础语法循环案例练习 前言 一.早午晚安喵喵喵 二.判断奇偶数 三.班长请客 四.1-100跳过个位为3的数求和 五.第几个 ...
- 【前端学习】Day-16 JS基础、循环、函数、数组、字符串、字典
文章目录 1. 了解JavaScript 2. js小案例 3. JavaScript基础 4. js循环 5. js函数 6. js数组 7. js字符串 8. js练习题 1. 了解JavaScr ...
- 小学生都看得懂的C语言入门(1): 基础/判别/循环
c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++ ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...
- python学习基础篇——循环
每次想找自己做过的笔记,总是需要打开电脑,打开vscode,就觉得非常麻烦.为了能够让自己更高效找到笔记,打算将这里作为我的笔记本了.本人还只在python初级学习阶段,非科班出身.虽然建过模(为了毕 ...
最新文章
- Outlook数据提取工具readpst
- PDO的bindParam与bindValue的区别
- python线程池超过最大数量_python自定义线程池控制线程数量
- 用Python 给你的个人微信朋友圈数据生成一本电子书吧!
- 将BLOG作为输入平台 ……
- Java案例-用户注册邮箱验证将邮箱激活码存入redis功能实现
- SharePoint 2013的REST编程基础
- 浅谈Java的数据结构
- 邓俊辉数据结构学习-8-2-B树
- apt不询问直接安装
- 用堆栈和用递归分别实现倒序打印
- 博途plc连接电脑_PLC编程中如何连接电脑将程序写入PLC
- 如何维持手机电池寿命_教你一招,可以让你的手机电池容量长期维持在峰值,延长电池寿命...
- Java poi ppt图片置于底层_POI之PPT图片插入简单实例
- 未了(endless)([CCF] NOI Online 能力测试2 入门组第一题)
- Pomodoro Technique
- 非贪婪匹配:如何使用正则表达式碰到到第一个匹配到的字符串就停止
- js图片转base64
- Qt 错误提示1: invalid use of incomplete type ‘***‘
- 反骨之Java是如何解决并发中的可见性问题的
热门文章
- 跨国企业在中国 | 洲际新签15家特许经营模式酒店;爱马仕中国第26家卖店在厦门揭幕...
- 将标签转为onehot编码
- OpenPLC61850: An IEC 61850 MMS compatible open source PLC for smart grid research
- 如何选择合适的统计学方法
- 通过站点优化记录规划书
- Canopen对象字典学习
- 图片合成视频,视频文件过大了,python 改变视频的码率, 压缩视频文件
- 什么是多态?为什么用多态?有什么好处?[转]
- 【tensorflow学习】Ftrl学习
- flink1.14.0+mysql5.7+mysqlcdc2.2.1报错org.apache.flink.shaded.guava18.com.google.common.util.concurren