golang 跳出多重循环的高级break用法说明
平时写代码过程中难免会遇到循环嵌套的操作,这时候最头疼的就是在break的时候需要一层一层的退出或者使用goto语句,golang有一种和goto方式类似但是goto方式更友好并且更易读的高级break用法,就是在循环外使用label标记退出哪一层循环的方式。
示例代码:
I: fori:=0;i<2;i++{ forj:=0;j<5;j++{ ifj==2{ breakI } fmt.Println("hello") } fmt.Println("hi") }
程序的运行结果:
hello
hello
补充:golangfor的select体中如何break外层循环
问题
默认在select中break是只跳脱了select体,而不是结束for循环
for{ select{ case<-tick.C: //dosometing case<-stop: break//break的不是for循环,而是跳脱select,执行doNext() } doNext() }
如何在for的select体中break到外层循环呢?
1.解决办法
1.1使用带标签的break
LOOP:for{ select{ case<-tick.C: //dosometing case<-stop: breakLOOP//break的for循环,跳转执行doOther() } doNext() } doOther()
等价于C的goto,但是又不同。比如这里for循环前的标签,对于如果使用gotoLOOP会导致再次执行循环。但是golang的break到这里是跳出循环,执行循环之后的操作
1.2使用return
for{ select{ case<-tick.C: //dosometing case<-stop: return//干净利落,适合退出goroutin的场景 } doNext() } doOther()
1.3使用标志
isStop:=false for{ select{ case<-tick.C: //dosometing case<-stop: isStop=true//干净利落,适合退出goroutin的场景 break } ifisStop{ break } doNext() } doOther()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。