Go语言流程控制中的break,continue和goto(七)
break(跳出循环)
break用于跳出整个循环,如下:
func main() { for i:=0;i<10;i++{ if i>3{ break } fmt.Println(i) } }
// 0 1 2 3
代码里只会打印到3,当大于3时会跳出整个for循环,注意整个for循环指的是直接包含break的那层for循环,举个例子:
func main() { for i:=0;i<10;i++{ for j:=0;j<10;j++ { if j == 5 { break } fmt.Printf("%v-%v\n",i, j) } } }
查看上述代码的结果,就会发现内层循环只能打印到4,而外层循环可以到9(即走完了整个for循环)。
除此之外,我们还可以使用标签来退出指定循环。改造上面的双层循环代码,如下:
func main() { EX: for i:=0;i<10;i++{ for j:=0;j<10;j++ { if j == 5 { break EX } fmt.Printf("%v-%v\n",i, j) } } }
我在最外层for循环上面加一个 EX 标签,然后 break EX,此时的结果就是当j==5时,从最外面的for循环退出来了。为了对比,可以再试下:
func main() { for i:=0;i<10;i++{ EX: for j:=0;j<10;j++ { if j == 5 { break EX } fmt.Printf("%v-%v\n",i, j) } } }
其实这种写法跟不加标签是一样的效果,上面也说到了,break是退出当前包含它的循环的。
continue(继续下一次循环)
continue 是继续下一次的循环,与 break 的区别就是不跳出整个循环,只跳过此次循环:
func main() { for i:=0;i<10;i++{ if i==5{ continue } fmt.Println(i) } } // 跳过了5,继续后面的循环 // 0 1 2 3 4 6 7 8 9
continue 也支持标签写法:
func main() { EX: for i:=0;i<10;i++{ for j:=0;j<10;j++ { if j == 5 { continue EX } fmt.Printf("%v-%v\n",i, j) } } }
goto(跳转到指定标签)
goto是个好东西,它可以跳转到我们指定的标签,从而执行那部分代码,例子:
func main() { for i:=0;i<10;i++{ for j:=0;j<10;j++ { if j == 5 { goto breakTag } fmt.Printf("%v-%v\n",i, j) } breakTag: break } }
如上代码,当 j==5 时,使用goto跳转到breakTag标签处,而这个标签下执行了break(注意break位置),从而使得最外层的for循环中断,是不是很好用。但是一般不主张使用goto语句,可能是因为太灵活反而容易造成程序混乱。