4.4.5 for循环控制
实现一段代码循环的执行。for循环一共有四个要素,分别是循环变量初始化(i=0)、循环条件(i<10)、循环操作(fmt.println)、循环变量迭代(i++)。直到循环条件为false才退出循环。其中循环条件返回一个bool类型的表达式。
for循环主要存在4种使用方法:
1) 一般情况:for 循环变量初始化;循环条件;循环变量迭代{循环操作 }
2)省略初始化和迭代,将其放到其他位置:for 循环判断条件 {循环操作}
3)只使用for,配合break使用跳出循环。
4)for-range方法【该方法可以直接遍历中文】,方便便利字符串和数组,range返回下标和对应值。
//常用循环
for i := 1; i < 5; i++ {
fmt.Println("hello,xzc")
}
//变量初始化和变量迭代写到其他位置
j := 1
for j < 3 {
fmt.Println("hello,xzc2")
j++
}
//只是用for配合break语句使用
k := 1
for {
if k < 4 {
fmt.Println("hello,xzc3")
} else {
break
}
k++
}
//for-range的方式可以方便便利字符串和数组
//一般方法:该方法遍历中文将会出现乱码,因此需要用切片来处理
str := "helloworld"
for i := 0; i < len(str); i++ {
fmt.Printf("%c", str[i])
}
str3 := "你好北京"
str3_1 := []rune(str3)
for i := 0; i < len(str3_1); i++ {
fmt.Printf("%c", str3_1[i])
}
//for range遍历,该方法可以直接用来遍历中文
str2 := "helloxzc"
for index, val := range str2 {
fmt.Printf("index=%d,val=%c ", index, val)
}
4.4.6 while和do…while实现
go语言中没有while和do_while语法,可以通过for循环来实现其使用效果。
while–通过for+if+break来实现,其中for用来循环,if表示限制条件,break用来跳出循环。
do_while同样使用for循环实现,将if_break限制条件写在循环语句之后而已。
//while表达
i := 0
for {
if i > 5 {
break
}
fmt.Println("hello,while")
i++
}
//do_while表达
j := 0
for {
fmt.Println("hello,do_while")
j++
if j > 5 {
break
}
}
4.4.7 多重循环控制
将一个循环放在另一个循环体内,就形成了嵌套循环。在外边的for成为外层循环;在里面的for成为内层循环【一般使用两层,最多不要超过三层】
只有内层循环的循环条件为false时,才会完全跳出内层循环,结束外层的当次循环,开启外层的下一次循环。
外层m次,内层n次,因此内层循环体一共需要执行m*n次
4.4.8 跳转控制语句-break
break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch语句。
注意:break语句出现在多层嵌套的语句块中,可以通过标签指明要终止的是哪一层语句
//随机生成数,当大于80时结束
cout := 0
for {
rand.Seed(time.Now().UnixNano()) //这个地方会长时间输出同一个值,有点问题
n := rand.Intn(100) + 1 //获取1-100之间的随机数[0,100)
cout++
fmt.Println(n)
if n >= 80 {
break
}
}
fmt.Println(cout)
//通过标签指定跳出哪一层
lable2:
for i := 0; i < 4; i++ {
//label1: //设置一个标签
for j := 0; j < 3; j++ {
if j == 2 {
//break //默认跳出最近的for循环,当j==2时跳出内层循环,继续执行i的循环
//break label1 //当j==2时,跳出外层循环,执行当前i+1之后的循环。
break lable2 //结束整个循环
}
}
//找出100之内,当和大于100的当前数字
sum := 0
for i := 0; i < 100; i++ {
sum += i
if sum > 100 {
fmt.Println("当前的数为:", i)
break
}
}
//实现登录验证,只有三次机会,输入正确用户名密码则提示登陆成功
var name string
var pwd string
loginChance := 3
for i := loginChance; i >= 0; i-- {
fmt.Scanln(&name)
fmt.Scanln(&pwd)
if name == "xzc" && pwd == "123" {
fmt.Println("登陆成功")
break
} else {
fmt.Printf("输入错误,你还有%d次机会", i)
}
}
4.4.9 跳转控制语句-continue
continue语句用于结束本次循环,继续下一次的循环,即后面的代码语句不再执行,二十直接到循环迭代进行下一次的循环判断。
出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,类似break标签使用规则。
func xunhuan_continue() {
for i := 0; i < 5; i++ {
if i < 3 {
fmt.Println("continue之前的语句", i)
continue
}
fmt.Println("continue之后的语句", i)
}
4.4.10 跳转控制语句-goto
Go语言的goto语句可以无条件的转移到程序中指定行,通常配合条件语句配合使用,可以用来实现条件转移,跳出循环体等功能。
一般而言不主张使用goto语句以免造成程序流程的混乱,使理解和调试程序都产生困难。
func xunhuan_goto() {
for i := 0; ; i++ {
if i > 5 {
goto label1
}
fmt.Println(i)
}
label1:
fmt.Println("大于五输出")
}
4.4.11 跳转控制语句-return
如果return 在普通函数里,表示跳出该函数,不再执行函数中return后面代码,也可以理解为终止函数。
如果return实在main函数里,表示终止程序。