golang 跳出for循环操作
执行以下代码,发现无法跳出for循环:
funcSelectTest(){ i:=0 for{ select{ case<-time.After(time.Second*time.Duration(2)): i++ ifi==5{ fmt.Println("跳出for循环") } } fmt.Println("for循环内i=",i) } fmt.Println("for循环外") }
解决办法有两个:
1.使用break:
funcSelectTest(){ i:=0 Loop: for{ select{ case<-time.After(time.Second*time.Duration(2)): i++ ifi==5{ fmt.Println("跳出for循环") breakLoop } } fmt.Println("for循环内i=",i) } fmt.Println("for循环外") }
2.使用goto:
funcSelectTest(){ i:=0 for{ select{ case<-time.After(time.Second*time.Duration(2)): i++ ifi==5{ fmt.Println("跳出for循环") gotoLoop } } fmt.Println("for循环内i=",i) } Loop: fmt.Println("for循环外") }
分析:
使用breaklable和gotolable都能跳出for循环;不同之处在于:break标签只能用于for循环,且标签位于for循环前面,goto是指跳转到指定标签处
补充:golang跳出forselect循环
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,forselect配合时,break并不能跳出循环。
functestSelectFor(chExitchanbool){ for{ select{ casev,ok:=<-chExit: if!ok{ fmt.Println("closechannel1",v) break } fmt.Println("ch1val=",v) } } fmt.Println("exittestSelectFor") }
如下调用:
//尝试2selectfor跳出循环 c:=make(chanbool) gotestSelectFor(c) c<-true c<-false close(c) time.Sleep(time.Duration(2)*time.Second)
运行结果如下,可以看到break无法跳出循环:
... closechannel1false closechannel1false closechannel1false closechannel1false ...
了解决这个问题,需要设置标签,break标签或goto便签即可跳出循环,如下两种方法均可。
functestSelectFor2(chExitchanbool){ EXIT: for{ select{ casev,ok:=<-chExit: if!ok{ fmt.Println("closechannel2",v) breakEXIT//gotoEXIT2 } fmt.Println("ch2val=",v) } } //EXIT2: fmt.Println("exittestSelectFor2") }
同样调用,输出结果如下:
ch2val=true ch2val=false closechannel2false exittestSelectFor2
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。