goto label
goto 可以无条件的跳转执行的位置,但是不能跨函数。
label 不是代码块,可以理解为它是一个 position,直接跳到这个 position 然后接着向下运行。
func worker4() {fmt.Println(1)goto labelfmt.Println(2)
label:fmt.Println(3)
}
输出
1
3
func worker5() {
label:fmt.Println(1)time.Sleep(time.Second)goto labelfmt.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 + jfmt.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 + jfmt.Println(sum)if sum >= 3 {continue label}fmt.Println("after")}}fmt.Println("out1")
}
2
after
3
3
out1