golang for 循环
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 循环的更多相关文章
- Golang的循环结构-for语句
Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...
- golang for循环里面创建协程问题的研究
原本想在一个for里面创建10个协程,这些协程顺序拿到for的递增变量,把这10个递增变量都打印出来.但事与愿违,于是做实验,查书,思考,写出以下记录. golang里,在for循环里面起协程,如下代 ...
- golang for 循环变量取内存地址
前几天提交的代码进行测试的时候发现变量无法赋值,原始代码如下: for _, asset := range dspInfo.native.Assets { var resAsset protocol. ...
- golang中循环或递归求阶乘
package main import "fmt" func factorialFor(num int) (ret int) { // 循环求阶乘 ret = 1 for i := ...
- Golang语言的入门开始
一.golang介绍与安装 二.golang-hello world 三.golang的变量 四.golang的类型 五.golang的常量 六.golang的函数(func) 七.golang的包 ...
- 使用python网络库下载
下载1000次网页资源 1,普通循环方式下载1000次,非常慢 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import os impor ...
- Go:定时执行任务time.sleep和time.tick的优劣
golang 写循环执行的定时任务,常见的有以下三种实现方式:1.time.Sleep方法: for { time.Sleep(time.Second) fmt.Println("我在定时执 ...
- 你认识的C# foreach语法糖,真的是全部吗?
本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包.foreach.为了便于理解,我重新组织了语言,以倒叙结构行文. 先给大家提炼出一个C#题:观察 ...
- golang运算与循环等
一.golang运算符 1.算术运算符 + 相加- 相减* 相乘/ 相除% 求余++ 自增-- 自减 2.关系运算符 == 等于!= 不等于> 大于< 小于>= 大于等于<= ...
- golang(一)-for 循环
golang 的循环控制中大多还是和java 很相似的 , 不过golang只有一种循环 就是for循环: for 有三个循环控制关键字 : break . continue . goto 其中 ...
随机推荐
- 深入探究Java中的对象类型变量声明操作——在声明对象时,系统究竟做了什么?
深入探究Java中的对象类型变量声明操作--在声明对象时,系统究竟做了什么? 摘要:本文主要对Java中的对象类型变量的声明的底层原理做了探究. 目录 深入探究Java中的对象类型变量声明操作--在声 ...
- 一、tcp三次握手
(1)首先客户端向服务器端发送一段tcp报文,其中标志位为SYN,表示"请求创建新连接"序列号为sqe=x,随后进入SYN_SEND状态 (2)服务器端接受到客户端发送的tcp报文 ...
- 【3.x合批亲测】使用这个优化方案,iPhone6也能飞起来,直接拉满60帧!
大家好,我是晓衡! 上周我花了3天的时间,体验测试了一款 Creator 3.x 性能优化工具:98K动态分层合批. 它能将 DrawCall 超过 1000+ 次的 2D 界面,实现运行时节点分层排 ...
- angular2-qrcode 引用报错 error NG8001: 'qr-code' is not a known element:
error NG8001: 'qr-code' is not a known element: 解决方案 假如你的组件模块叫做a-demo.module,你的组件叫做print.component.t ...
- angular---angular路由守卫,有的可以访问有的不可以访问,有的路由地址只有在满足条件时候访问,其它禁止访问,
- C/C++内存对齐原则
C/C++内存对齐 what && why 当用户自定义类型时(struct 或 class),编译器会自动计算该类型占用的字节数. C/C++ 为什么要内存对齐?我道行太浅,摘抄了网 ...
- SQL笔试真题练习
一.现有以下两张表: 第一张表名为cust,其表结构如下: 字段名 字段说明 是否主键 Studentno 学号,数据类型为整型的 是 Name 学生名字,数据类型为字符串型的 否 Address 学 ...
- P32_全局配置 - tabBar
什么是 tabBar tabBar 是移动端应用常见的页面效果,用于实现多页面的快速切换.小程序中通常将其分为: 底部 tabBar 顶部 tabBar 注意:tabBar中只能配置最少 2 个.最多 ...
- ASP.NET Core开发者指南(2022版路线图)
ASP.NET Core开发者指南 2022年 ASP.NET Core 开发者指南: 在下面,您可以看到一个图,说明可以采用的路径以及要成为ASP.NET Core开发人员所想要学习的库.我将此图作 ...
- C# winform 一个窗体需要调用自定义用户控件的控件名称
给用户控件ucQRCode增加属性: //二维码图片 private PictureBox _pictureBoxFSHLQrCode; public PictureBox PictureBoxFSH ...