1.for 循环

for循环是Golang唯一的循环语句。

for 初始表达式; 布尔表达式; 迭代因子 {

循环体;

}

package main

import "fmt"

func main() {
for i := 0; i < 5; i++ { //定义i变量值为0,判断i的值小于5执行下面的打印,每次i的值为i=i+1
fmt.Printf("i的值为:%v\n", i)
}
}

执行结果

i的值为:0
i的值为:1
i的值为:2
i的值为:3
i的值为:4

循环字符串

package main

import "fmt"

func main() {
var s1 string = "hello,world"
l1 := len(s1) //按照字符串的字节长度
fmt.Printf("s1的长度为:%v\n", l1)
for i := 0; i < len(s1); i++ {
fmt.Printf("i[%d]的值为:%c\n", i, s1[i]) //每次字节的值为s1[0-11]
}
}

执行结果

s1的长度为:11
i[0]的值为:h
i[1]的值为:e
i[2]的值为:l
i[3]的值为:l
i[4]的值为:o
i[5]的值为:,
i[6]的值为:w
i[7]的值为:o
i[8]的值为:r
i[9]的值为:l
i[10]的值为:d

注意:如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误,会出现乱码。原因是传统的对字符串的遍历是按照字节来遍历,而一个汉字在 utf8 编码是对应 3 个字节。解决方式,将字符串转成切片再进行遍历

package main

import "fmt"

func main() {
var s1 string = "hello,世界"
s2 := []rune(s1) //将s1字符串转成切片。
for i := 0; i < len(s2); i++ { //循环切片下标,打印下标对应的值
fmt.Printf("key=%d,val=%c\n", i, s2[i])
}
}

执行结果

key=0,val=h
key=1,val=e
key=2,val=l
key=3,val=l
key=4,val=o
key=5,val=,
key=6,val=世
key=7,val=界

2.for 死循环

func main() {
//第一种写法
for {
fmt.Println("hello,world")
}
//第二种写法
for ;;{
fmt.Println("hello,world")
}
}

输出结果

hello,world
hello,world
hello,world
.......

3.for range循环(键值循环)

for range 可以遍历数组、切片、字符串、map 及通道,for range 语法上类似于其它语言中的 foreach 语句,一般形式为:

for key, val := range coll {

...

}

  • range 返回一个值的时候,默认为key(下标),返回两个值的时候为key(下标),val(下标对应的值)
  • 遍历map时为随机输出,slice则为索引顺序输出

使用for lang打印字符串

package main

import "fmt"

func main() {
var s1 string = "hello,世界"
for key, val := range s1 { //key为索引值,val为具体的索引对应的值
fmt.Printf("key=%d,val=%c\n", key, val)
}
}

执行结果

世的对应下标为6

界的对应下标为9

因为一个中文用三个字节,世对应的下标为(6,7,8)界(9,10,11)只输出了开头的下标。

key=0,val=h
key=1,val=e
key=2,val=l
key=3,val=l
key=4,val=o
key=5,val=,
key=6,val=世
key=9,val=界

4.for 循环中的关键字

4.1 break

表示停止当前循环

4.1.1 单次循环

package main

import "fmt"

func main() {
for i := 0; i < 10; i++ {
if i == 6 { //当i=6时执行下面的代码
break //终止本次循环
}
fmt.Println(i)
}
}

执行结果

当i等于6时,if条件成立,执行break终止了本次循环,所以不会继续执行循环。

0
1
2
3
4
5

break 标签

使用label语句,给需要停止的循环加标签,如:label1,然后break label1即可以停止当前循环。

package main

import "fmt"

func main() {
label1: //给一层循环加标签label1
for i := 0; i < 4; i++ { //第一层循环
for j := 0; j < 3; j++ { //第二层循环
if i == 2 && j == 1 { //当循环i等于2,j等于1终止本次第二层循环
//break在第二层循环语句内,默认终止第二层的本次循环,第一层循环还会继续执行
break label1 //终止第一层循环,当i等于2,j等于1的时候,终止第一次循环,第一次循环内的语句也不会继续执行了
}
fmt.Printf("i的值为:%v,j的值为:%v\n", i, j)
}
}
}

执行结果

默认在第二次循环使用break不加标签,只会终止第二层循环,还会继续输出i等于3时j的值

当break加上标签,终止了第一层循环后,当i等于2,j等于1时,第一层循环终止了,所以不会执行后面i等于3的结果。

i的值为:0,j的值为:0
i的值为:0,j的值为:1
i的值为:0,j的值为:2
i的值为:1,j的值为:0
i的值为:1,j的值为:1
i的值为:1,j的值为:2
i的值为:2,j的值为:0

4.2 continue

4.2.1 单次循环

跳过本次循环,执行下一次循环

package main

import "fmt"

func main() {
for i := 0; i < 10; i++ {
if i == 6 { //当i=6时执行下面的代码
continue //跳过本次循环,继续执行本地循环的下一次循环
}
fmt.Println(i)
}
}

执行结果

0
1
2
3
4
5
7
8
9

4.2.2 continue 标签

使用label语句,给需要跳过的循环加标签,如:label1,continue label1即可以跳过本地循环,执行下一次循环

package main

import "fmt"

func main() {
label1: //给一层循环加标签label1
for i := 0; i < 4; i++ { //第一层循环
for j := 0; j < 3; j++ { //第二层循环
if i == 2 && j == 1 { //当循环i等于2,j等于1跳过本次第二层循环
//continue在第二层循环语句内,默认跳过第二层的本次循环,继续执行第二层循环的下一次循环
continue label1 //跳过第一层循环,当i等于2,j等于1的时候,跳过第一次循环,继续执行第一层循环的下一次循环
}
fmt.Printf("i的值为:%v,j的值为:%v\n", i, j)
}
}
}

执行结果

默认在第二次循环使用continue不加标签,只会终止第二层循环,还会继续输出i等于2j等于2。

当continue加上标签,跳过了第一层循环后,当i等于2,j等于1时,第一层循环跳过了,所以不会执行后面i等于2,j等于2的结果。

i的值为:0,j的值为:0
i的值为:0,j的值为:1
i的值为:0,j的值为:2
i的值为:1,j的值为:0
i的值为:1,j的值为:1
i的值为:1,j的值为:2
i的值为:2,j的值为:0
i的值为:3,j的值为:0
i的值为:3,j的值为:1
i的值为:3,j的值为:2

4.3 goto

通过标签进行代码间的无条件跳转。(跳转到需要执行的代码行)goto语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用goto语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时:

package main

import "fmt"

func main() {
for i := 1; i < 4; i++ {
for j := 1; j < 3; j++ {
if i == 2 && j == 2 {
goto lable1 //当循环i等于2,j等于2的时候直接跳转到标签lable1对应的代码处
}
fmt.Printf("i的值为:%v,j的值为:%v\n", i, j)
}
}
lable1:
fmt.Println("goto跳转执行了")
}

执行结果

i的值为:1,j的值为:1
i的值为:1,j的值为:2
i的值为:2,j的值为:1
goto跳转执行了

4.4 return

在for循环中使用retuen,直接结束当前函数。

package main

import "fmt"

func main() {
for i := 1; i < 4; i++ {
for j := 1; j < 3; j++ {
if i == 2 && j == 2 {
return //结束当前函数
}
fmt.Printf("i的值为:%v,j的值为:%v\n", i, j)
}
}
fmt.Printf("main函数还在执行")
}

执行结果

当i等于2,j等于2时,直接执行return,结束了main函数,所以不会执行函数中的打印

i的值为:1,j的值为:1
i的值为:1,j的值为:2
i的值为:2,j的值为:1

golang for 循环的更多相关文章

  1. Golang的循环结构-for语句

    Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...

  2. golang for循环里面创建协程问题的研究

    原本想在一个for里面创建10个协程,这些协程顺序拿到for的递增变量,把这10个递增变量都打印出来.但事与愿违,于是做实验,查书,思考,写出以下记录. golang里,在for循环里面起协程,如下代 ...

  3. golang for 循环变量取内存地址

    前几天提交的代码进行测试的时候发现变量无法赋值,原始代码如下: for _, asset := range dspInfo.native.Assets { var resAsset protocol. ...

  4. golang中循环或递归求阶乘

    package main import "fmt" func factorialFor(num int) (ret int) { // 循环求阶乘 ret = 1 for i := ...

  5. Golang语言的入门开始

    一.golang介绍与安装 二.golang-hello world 三.golang的变量 四.golang的类型 五.golang的常量 六.golang的函数(func) 七.golang的包 ...

  6. 使用python网络库下载

    下载1000次网页资源 1,普通循环方式下载1000次,非常慢 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import os impor ...

  7. Go:定时执行任务time.sleep和time.tick的优劣

    golang 写循环执行的定时任务,常见的有以下三种实现方式:1.time.Sleep方法: for { time.Sleep(time.Second) fmt.Println("我在定时执 ...

  8. 你认识的C# foreach语法糖,真的是全部吗?

    本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包.foreach.为了便于理解,我重新组织了语言,以倒叙结构行文. 先给大家提炼出一个C#题:观察 ...

  9. golang运算与循环等

    一.golang运算符 1.算术运算符 + 相加- 相减* 相乘/ 相除% 求余++ 自增-- 自减 2.关系运算符 == 等于!= 不等于> 大于< 小于>= 大于等于<= ...

  10. golang(一)-for 循环

    golang 的循环控制中大多还是和java 很相似的 , 不过golang只有一种循环 就是for循环: for 有三个循环控制关键字 : break . continue . goto  其中   ...

随机推荐

  1. 如何通过Java代码在PDF中插入、替换或删除图像?

    图文并茂的内容往往让人看起来更加舒服,如果只是文字内容的累加,往往会使读者产生视觉疲劳.搭配精美的文章配图则会使文章内容更加丰富,增加文章可读性的同时,也能提升用户体验.但由于PDF文档安全性较高,不 ...

  2. [深度探索C++对象模型]关于成员初始化列表(member initiallization list)

    四种特殊情况: 1.当初始化一个reference member时. 2.当初始化一个const member时. 3.当初始化一个base class的constructor,而它拥有一组参数时. ...

  3. angular11报错Can't bind to 'ngForOf' since it isn't a known property of 'tr'. 三种排查办法以及解决方案

    当你遇到Can't bind to 'ngForOf' since it isn't a known property of 'tr'. (" //无法绑定到"ngforof&qu ...

  4. three.js一步一步来--如何画出一根线

    下面是画出线的代码,可以参考一下哟~~ <template> <div style="width:1000px; height:800px"> <p& ...

  5. C 语言输出100至200之间的质数(素数)

    题目描述 运行 C 程序,输出 100 至 200 之间的质数. 输入描述 无 输出描述 输出 100 至 200 之间的质数,每行输出一个质数,每个质数前面需要带有序号. 输出样例 解题思路 在&l ...

  6. pycharm编辑器下载与使用

    pycharm编辑器下载与使用 一.pycharm编辑器 1.pycharm编辑器 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具.比如调 ...

  7. 【随笔记】FRAM 铁电随机存储器(MB85RC04VPNF)

    参考资料 器件规格书:https://atta.szlcsc.com/upload/public/pdf/source/20131104/1457706659695.pdf I2C总线规范:https ...

  8. day09-2-验证以及国际化

    验证以及国际化 1.概述 (1)概述 对于输入的数据(比如表单数据),进行必要的验证,并给出相应的提示信息 对于验证表单数据,SpringMVC 提供了很多使用的注解,这些注解由 JSR 303验证框 ...

  9. webrtc QOS笔记一 Neteq直方图算法浅读

    webrtc QOS笔记一 Neteq直方图算法浅读 目录 webrtc QOS笔记一 Neteq直方图算法浅读 Histogram Algorithm 获取目标延迟 遗忘因子曲线 想起博客园帐号了, ...

  10. 罗姆BU32107EFV缩写词

    ADC Analog-to-Digital Converter Att Attenuation 衰减 AMix Analog Mixing AVol Analog Volume BPF Band-Pa ...