Go循环语句的使用

148 阅读5分钟

计算机中,我们经常需要对某些代码重复执行多次,一开始我们只懂的多复制几遍来让程序执行

package main

import "fmt"

func main() {
	fmt.Println("镜头前的你好帅!!")
	fmt.Println("镜头前的你好帅!!")
	fmt.Println("镜头前的你好帅!!")
	fmt.Println("镜头前的你好帅!!")
}

这样的做法,让我们要做的事情繁琐了很多,如果我们要输出1000句语句,那么是不是要把这些代码复制1000遍,非常非常麻烦,不过好在基本每个编程语言都提供了循环语句,简化了需要循环使用代码的使用情况,而Go也提供了 for 语句,来解决这些问题

格式

for 变量初始条件; 循环条件; 变量迭代{}

for 循环条件{}

for {}

代码示例

for 变量初始条件; 循环条件; 变量迭代{}

package main

import "fmt"

func main() {

	for init := 1; init < 4; init++ {
		fmt.Println("镜头前的你好帅!!")
	}
}

这里连续输出了3句 "镜头前的你好帅!!",忽略这个的双引号。

看到这里,有人可能会很好奇,这个 for语句的循环顺序是个什么样子,那么下面讲一些

程序指向到 for语句这边,先初始化了 init变量,把它赋值为1,然后去循环条件中判断一下,init 是否小于4,由于条件达成 1 < 4,进去循环代码块中,打印了一遍 "镜头前的你好帅!!",当循环代码块执行完毕后,它会结束第一次循环;

然后进入变量迭代这个地方,也就是 init++,这个时候,因为 init++,所以 init 变为2了,然后再去循环条件中判断一下,这时候 init为2 < 4,所以条件达成,再次进入循环代码块,打印 "镜头前的你好帅!!",然后退出第二次循环;

然后再次进入变量迭代 init++,这时候 init为3,再去循环条件中判断init 是否小于4,由于 init 为3 < 4,所以条件再次达成,进入循环代码块中,再次打印 "镜头前的你好帅!!",然后退出第三次循环,这时候已经打印3次**"镜头前的你好帅!!"** 了,跟我们上面说连续输出3句的答案是一样的,下面就是如何结束这个 for循环

当第3次循环结束后,进入 变量迭代,这时候 init为4,然后去循环条件中,跟 init < 4对比,由于 init这时候等于4,所以 4 < 4是错误的,所以 for循环彻底结束

为了给大家证明一下,init的值真的为4,我把变量的所属范围,扩大到整个 main函数

package main

import "fmt"

func main() {


	var init int
	for init = 1; init < 4; init++ {
		fmt.Println("镜头前的你好帅!!")
	}

	fmt.Println("init 的值为:", init)
}

在这里插入图片描述

我再给大家画个图感受一下

在这里插入图片描述

1 只被执行1次,其它执行多少次,都是看条件的

1执行后的顺序,就是 2 → 3 → 4 → 2 → 3 → 4 依次循环(如果条件允许的话)

for 循环条件{}

在Go语言中,是没有 while循环的,但是我们可以用这个模拟一下

什么是 while循环呢?

while (循环条件) {}

这个展示的格式,我是以 Java为例

package main

import "fmt"

func main() {

	var init int = 1
	for init < 4{
		fmt.Println("镜头前的你好帅!!")
		init++
	}
}

这个看起来是不是跟上面的一样,没错,输出的结果是一样的,只是说形式变了而已,它只是没把变量的定义在for后面,for 后面只有一个判断条件,循环迭代我们写在了循环代码块中,这里就不多说了

for {}

package main

import "fmt"

func main() {

	var num int = 1
	for {
		fmt.Println("num 的值为:", num)
		if num >= 20 {
			break
		}
		num++
	}
}

因为这个 for循环是没有循环条件在的,所以我们循环代码块的时候,要给它一个条件,让它执行到某个条件就停止下来,不然这个 for循环会死循环下去...

因为在这个代码中,我们用到了 break关键字,那么接下来就来讲这个关键字在 for循环中的用处

break在循环中的应用

既然上面有代码了,就不多贴一遍了,就说下在代码中,break的用处好了

在循环中,如果执行到break,那么程序会终止这个循环语句,但在多层循环中,只是终止了内层循环语句

package main

import "fmt"

func main() {

	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{
				break
			}
			fmt.Println("这时候的i为:", i)
		}
	}
}

在这里插入图片描述

从这个输出可以看到,在内循环中,当判断到 i == 3的时候,终止了内层循环,而外层循环照样可以执行,这时候只要外循环再执行一次,那么内循环就会再次被执行到

那么能不能直接跳出循环呢?答案是有的 ,不过我们需要让 break关键字标签配合

break和标签的使用

package main

import "fmt"

func main() {

	label:
	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{
				break label
			}
			fmt.Println("这时候的i为:", i)
		}
	}

	fmt.Println("程序执行完,终止")
}

在这里插入图片描述

输出只截取了下面一部分,当执行内存循环的时候,判断到 i == 3,执行 break label,这时候,程序的执行就会跳到 label标签定义的地方,如上面代码所示 label :

continue在循环中的应用

package main

import "fmt"

func main() {
	
	for i := 1; i < 5; i++ {
		if i == 3 {
			continue
		}
		fmt.Println("这个i的值为:", i)
	}

	fmt.Println("程序执行完,终止")
}

在这里插入图片描述

从这个输出可以看出,continue 关键字只是跳出了 i == 3的时候的那一次循环,整个循环之后该怎么执行就该怎么执行,不会跟 break关键字一样,直接终止整个循环,当然这个你可以自己测试一下,把 continue 换成break就好,换成 break后,你会发现打印出来的内容,比用 continue关键字的时候,少了一条 "这个i的值为:4"

在这直接给你们贴图出来看,这个是上面的代码 continue换成break代码后的输出

在这里插入图片描述

多种循环中使用 continue

package main

import "fmt"

func main() {
	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{ 
				continue
			}
			fmt.Println("这时候的i为:", i)
		}
	}

	fmt.Println("程序执行完,终止")
}

在这里插入图片描述

为什么是这么输出呢?其实还是例子没举好,在这里,程序其实执行了4次continue语句,当 i == 3的时候,if 语句判断完之后,执行了 continue语句,其实只是跳出了这次内循环,跳出后,因为内循环的条件还能符合,就再次进入内循环,再次执行 if语句中的continue,以此循环4次,所以才没有输出 "这时候的i为:3"。而上面相同代码的 break,是只进入了1次内循环,然后遇到 break后,直接终止内循环,因为还符合外循环的条件,所以再次进入内循环,不过这次的值已经变为4了。

continue和标签的使用

package main

import "fmt"

func main() {

	label:
	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{
				continue label
			}
			fmt.Println("这时候的i为:", i)
		}
	}

	fmt.Println("程序执行完,终止")
}

在这里插入图片描述

从这个可以看到,跟 break跟标签使用不一样,break那边是直接跳到外层for循环后,直接终止了;而 continue跳出外循环后,还继续进去执行,只是没有执行 i == 3这部分的内容

从这两个可以看出来,break跟标签可以停止整个大的循环,而 continue跟标签只能跳出一次大循环,如果跳出后,还符合循环条件,那么会再次进入循环

goto在循环中的应用

goto是跳转语句用的,它只能跟标签结合使用

package main

import "fmt"

func main() {

	label:
	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{
				goto label
			}
			fmt.Println("这时候的i为:", i)
		}
	}

	fmt.Println("程序执行完,终止")
}

在这里,goto之后,程序进入了死循环,每次当 i == 3之后,调用了 goto label,程序又重新跳转到 for循环语句上面标签处,开始重新执行for,不过这个时候,跟上面的continue和break跳转不一样,它是重新开始执行,所以进入了死循环

return在循环中的应用

package main

import "fmt"

func main() {

	for i := 1; i < 5; i++ {
		for j := 1; j < 5; j++ {
			if  i == 3{
				return
			}
			fmt.Println("这时候的i为:", i)
		}
	}

	fmt.Println("程序执行完,终止")
}

在这里插入图片描述

从输出看出,程序没有输出 "这时候的i为:4",也没有输出 "程序执行完,终止",这是怎么回事呢?

其实 return关键字,是返回结果,终止函数的执行,在调用的函数中,是跳出调用的函数;如果是main函数,那么是直接程序终止。所以在这里,程序没有执行到后面的 "程序执行完,终止",所以也没有输出它


欢迎大家关注下个人的「公众号」:独醉贪欢