goto label

goto 可以无条件的跳转执行的位置,但是不能跨函数

label 不是代码块,可以理解为它是一个 position,直接跳到这个 position 然后接着向下运行。

func worker4() {
	fmt.Println(1)
	goto label
	fmt.Println(2)
label:
	fmt.Println(3)
}

输出

1
3
func worker5() {
label:
	fmt.Println(1)
	time.Sleep(time.Second)
	goto label
	fmt.Println(2)
	fmt.Println(3)

}

将会无限输出 1

break label

break 只能跳出当前循环,而 break label 可以跳出多层循环,它要配合 for 循环使用,而不能用在 switch 。

label 下面要紧跟 for 语句,中间不能有其他代码。所以,break label 就是跳出 label 下面的那个 for 循环。

func worker6() {
	for x := 1; x < 10; x++ {
	label:
		// fmt.Println("inter") // 此处不能有代码
		for i := 1; i < 10; i++ {
			for j := 1; j < 10; j++ {
				sum := i + j
				fmt.Println(sum)
				if sum == 3 {
					break label
				}
			}
		}
		fmt.Println("out1")
	}
	fmt.Println("out2")
}
continue label

continue label 这个功能和 break 有点类似,区别在于 break 是强制终止, continue 是跳出来继续循环。

func worker7() {
label:
	for i := 1; i < 3; i++ {
		for j := 1; j < 3; j++ {
			sum := i + j
			fmt.Println(sum)
			if sum >= 3 {
				continue label
			}
			fmt.Println("after")
		}
	}
	fmt.Println("out1")
}
2
after
3
3
out1
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐