首页 > 其他分享 >golang for 循环

golang for 循环

时间:2023-02-19 14:33:24浏览次数:38  
标签:val ++ fmt golang 循环 key main

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

标签:val,++,fmt,golang,循环,key,main
From: https://www.cnblogs.com/LI-XinYu/p/17132508.html

相关文章

  • golang 单测运行单个函数、文件、跳过文件命令
    1、单测运行1.2运行某个单测函数gotest-v-run=xxx,xxx是函数名,支持正则表达式;参数-v说明需要打印详情提示Golang单测是根据前缀匹配来执行的,gotest-v-run=......
  • 分支和循环(二) 2023-2-16
    for循环for循环将条件、判断、调整放到同一部分相比while循环更好调整代码for循环流程图表达式1只执行一次之后不参与循环,执行完语句后调整表达式3for循环和while循环......
  • Golang基础-Slices
    声明Slicevarempty[]int//anemptyslicewithData:=[]int{0,1,2,3,4,5}//aslicepre-filledwithsomedatamake([]T,len)make([]T,len,......
  • Golang基础-格式化输出
    General%v thevalueinadefaultformat whenprintingstructs,theplusflag(%+v)addsfieldnames%#v aGo-syntaxrepresentationofthevalue%T aGo-synta......
  • 三种循环的比较 do...for...while... java 230218
    需求输出0-9publicclassTest9{publicstaticvoidmain(String[]args){//输出0到9//for.i+tabfor(inti=0;i<10;i++){......
  • golang 生成swagger 文档
     github:https://github.com/swaggo/swag/blob/master/README_zh-CN.md 参考:https://www.cnblogs.com/cxykhaos/p/15345317.html 第一步:下载swag命令:goinstall......
  • 无限循环与游戏循环 java 230218
    循环次数没有上限的循环示例while(true){System.out.println("打游戏");}游戏循环游戏里基本都是无限循环用户可以在适当的时机选择退出这个无限循环importjava.util......
  • Golang基础-字符串
    StringsAstringinGoisanimmutable(不可变的)sequenceofbytes,whichdon'tnecessarilyhavetorepresentcharacters.doublequotes("")和backticks(`)的区别......
  • 循环控制 continue 230218
    功能中止本轮循环切到下一轮循环例子publicclassTest3{publicstaticvoidmain(String[]args){//continue,控制循环的过程,跳过inti=0;......
  • Golang基础-Basics
    PackagesGo语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,......