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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。