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 其中 ...
随机推荐
- react 高效高质量搭建后台系统 系列 —— antd和样式
其他章节请看: react 高效高质量搭建后台系统 系列 antd 后续要做登录模块(主页),不仅要解决请求数据的问题,还需要完成 antd 配置以及样式的准备. antd 多种主题风格 详情请看 这 ...
- Redis 数据结构-简单动态字符串
Redis 数据结构-简单动态字符串 无边落木萧萧下,不尽长江滚滚来. 1.简介 Redis 之所以快主要得益于它的数据结构.操作内存数据库.单线程和多路 I/O 复用模型,进一步窥探下它常见的五种基 ...
- 算法之Dijkstra及其堆优化和SPFA:图上单源最短路径神器
签到题-- 题目传送门 SPFA算法 本人曾经写过一篇有关Bellman-ford的博,但就算是挂了优化的ford也只能过这道题的弱化版. 今天就先填个坑,先讲SPFA. 在这里我直接认为你们已经有一 ...
- (19)go-micro微服务filebeat收集日志
目录 一 Filebeat介绍 二 FileBeat基本组成 三 FileBeat工作原理 四 Filebeat如何记录文件状态: 五 Filebeat如何保证事件至少被输出一次 六 安装Filebe ...
- flutter 2.X报错 Bad state: Insecure HTTP is not allowed by platform:
flutter2.x开发遇到的问题 Bad state: Insecure HTTP is not allowed by platform: 翻译过来就是:错误状态:平台不允许不安全的HTTP: 产生 ...
- BC7-牛牛的字符矩形
题目描述 牛牛尝试用键盘读入一个字符,然后在屏幕上显示用这个字符组成的 3*3 的矩形. 输入描述 一行读入一个 char 类型的字符. 输出描述 输出这个字符组成的 3*3 矩形. 示例 1 输入: ...
- java入门与进阶-P1.5+P1.6
输入 Scanner输入语句介绍 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Sca ...
- Python 异步集群使用
目前在做Python项目用到同步和异步的方法使用Redis单机,现在要增加兼容Redis集群.也就说当前项目用到中以下4种Python使用Redis的方法都用到了. - 同步 异步 单机 涉及 涉及 ...
- 【学习日志】MongoDB为什么选择B树,而MySQL选择B+树实现索引
先说B树和B+树的区别 B树:非叶子节点也存储数据 B+树:只有叶子节点存储数据,且所有叶子节点通过指针相连接. 为什么MongoDB选择B树而,MySQL选择B+树呢?两种数据结构的区别摆在上面了, ...
- 尊重 respect
尊重他人,这里面的门道. 明面上尊重他人要在自身有地位有身份的前提下,你身边的其他人 才能高效接收到你传递的信号,这叫礼贤下士. 暂时没地位的人更是应该无时无刻释放出尊重他人的信号,来向外界传达你是一 ...