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 其中 ...
随机推荐
- 防微杜渐,未雨绸缪,百度网盘(百度云盘)接口API自动化备份上传以及开源发布,基于Golang1.18
奉行长期主义的开发者都有一个共识:对于服务器来说,数据备份非常重要,因为服务器上的数据通常是无价的,如果丢失了这些数据,可能会导致严重的后果,伴随云时代的发展,备份技术也让千行百业看到了其" ...
- 【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)
分布式事务的背景 随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘手的问题,那就是"分布 ...
- Pytorch:单卡多进程并行训练
1 导引 我们在博客<Python:多进程并行编程与进程池>中介绍了如何使用Python的multiprocessing模块进行并行编程.不过在深度学习的项目中,我们进行单机多进程编程时一 ...
- windows11预览版装WSA心得
这两天心血来潮想要装个WSA(安卓windows子系统),原来一直用的安卓模拟器(mumu啊蓝叠啊逍遥啊),但感觉像wsa这种安卓系统与主系统融合的模式更带感,于是开始了我艰苦的安装(瞎捯饬)之路 我 ...
- 【Regex】判断密码强度的正则表达式
原文地址 https://www.cnblogs.com/younShieh/p/17082522.html 如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~ 需求 最近 ...
- Xcode找不到.h或者.m文件解决办法 .h file not found
Xcode找不到.h或者.m文件解决办法 .h file not found 开篇唠叨 小黑最经又开始干iOS接入微信SDK了,目前刚开始就遇到了困难,于是总结一下分享给大家,要是大家看完了还解决 ...
- postgresql的mysql外部数据扩展mysql_fdw编译及安装
下载mysql_fdw项目文件:https://pgxn.org/dist/mysql_fdw/ 注:我使用的是ubuntu18.04,可以直接在仓库查看是否有二级制安装文件,当然是有的啦,这是很方便 ...
- Grafana 系列文章(十):为什么应该使用 Loki
️URL: https://grafana.com/blog/2020/09/09/all-the-non-technical-advantages-of-loki-reduce-costs-stre ...
- 如何修剪git reflog历史
背景: vscode插件git-graph可以方便查看git-commit-graph,效果很好,关键是交互性很好.点选任意commit即可预览提交内容,实在是太方便了,比我之前用命令行上git lo ...
- python学习第一周总结
第一周内容概要 day01 typora软件安装 markdown语法 typora软件功能介绍 网络博文编写教程 计算机的本质 计算机的五大组成部分 计算机的三大核心硬件 day02 操作系统 编程 ...