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循环相关推荐

  1. python基础 while循环练习

    这篇文章主要给大家分享的是5道关于python基础 while循环练习题,无论学习什么语言,练习都是必不可少的,下面文章的练习题挺精湛的,需要的朋友可以参考一下 1. 使用while循环输出1 2 3 ...

  2. Python基础之循环语句

    Python基础之循环语句 一.循环语句介绍 1.循环语句理解 2.循环语句示意图 二.循环语句的分类 三.循环控制语句 四.while循环 1.while死循环 2.while条件循环 五.brea ...

  3. python中for循环语句格式_Python基础-10循环语句

    Python Python开发 Python语言 Python基础-10循环语句 10.循环语句 对于循环语句,Python仅提供了while和for两个,并未像其他编程语言一样提供for...eac ...

  4. java循环基础知识_Java基础知识·循环语句

    掘友们,大家好呀,我是宸道. 今天要讲解的是Java基础的循环语句,虽然很基础但还是希望大家看完,就当时复习知识了,基础越牢固越好,对我们是有很大帮助的. 相关推荐 循环语句可以在满足循环条件的情况下 ...

  5. python基础——while循环(九九乘法表,阶乘计算器,三角形图案打印输出)

    python基础--while循环(九九乘法表,阶乘计算器,三角形图案打印输出) 一.目的 本人最近在学习python的基础语法,此文章用来记录学习过程所用,本文章讲述的是while循环的一些基础实例 ...

  6. python循环语句画图_Python基础之循环语句用法示例【for、while循环】

    本文实例讲述了Python基础之循环语句用法.分享给大家供大家参考,具体如下: while 循环 Python中while语句的一般形式: while 判断条件: statements 同样需要注意冒 ...

  7. JavaScript 基础语法循环案例练习

    JavaScript 基础语法循环案例练习 文章目录 JavaScript 基础语法循环案例练习 前言 一.早午晚安喵喵喵 二.判断奇偶数 三.班长请客 四.1-100跳过个位为3的数求和 五.第几个 ...

  8. 【前端学习】Day-16 JS基础、循环、函数、数组、字符串、字典

    文章目录 1. 了解JavaScript 2. js小案例 3. JavaScript基础 4. js循环 5. js函数 6. js数组 7. js字符串 8. js练习题 1. 了解JavaScr ...

  9. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  10. python学习基础篇——循环

    每次想找自己做过的笔记,总是需要打开电脑,打开vscode,就觉得非常麻烦.为了能够让自己更高效找到笔记,打算将这里作为我的笔记本了.本人还只在python初级学习阶段,非科班出身.虽然建过模(为了毕 ...

最新文章

  1. Outlook数据提取工具readpst
  2. PDO的bindParam与bindValue的区别
  3. python线程池超过最大数量_python自定义线程池控制线程数量
  4. 用Python 给你的个人微信朋友圈数据生成一本电子书吧!
  5. 将BLOG作为输入平台 ……
  6. Java案例-用户注册邮箱验证将邮箱激活码存入redis功能实现
  7. SharePoint 2013的REST编程基础
  8. 浅谈Java的数据结构
  9. 邓俊辉数据结构学习-8-2-B树
  10. apt不询问直接安装
  11. 用堆栈和用递归分别实现倒序打印
  12. 博途plc连接电脑_PLC编程中如何连接电脑将程序写入PLC
  13. 如何维持手机电池寿命_教你一招,可以让你的手机电池容量长期维持在峰值,延长电池寿命...
  14. Java poi ppt图片置于底层_POI之PPT图片插入简单实例
  15. 未了(endless)([CCF] NOI Online 能力测试2 入门组第一题)
  16. Pomodoro Technique
  17. 非贪婪匹配:如何使用正则表达式碰到到第一个匹配到的字符串就停止
  18. js图片转base64
  19. Qt 错误提示1: invalid use of incomplete type ‘***‘
  20. 反骨之Java是如何解决并发中的可见性问题的

热门文章

  1. 跨国企业在中国 | 洲际新签15家特许经营模式酒店;爱马仕中国第26家卖店在厦门揭幕...
  2. 将标签转为onehot编码
  3. OpenPLC61850: An IEC 61850 MMS compatible open source PLC for smart grid research
  4. 如何选择合适的统计学方法
  5. 通过站点优化记录规划书
  6. Canopen对象字典学习
  7. 图片合成视频,视频文件过大了,python 改变视频的码率, 压缩视频文件
  8. 什么是多态?为什么用多态?有什么好处?[转]
  9. 【tensorflow学习】Ftrl学习
  10. flink1.14.0+mysql5.7+mysqlcdc2.2.1报错org.apache.flink.shaded.guava18.com.google.common.util.concurren