這是一段求素數的代碼,是可以正常運行的。但是當我把第14行的代碼由break換成了return,代碼運行會報錯。不過雖然報錯,也是能夠先把正確結果列印出來再提示錯誤(見圖片)。請問為什么使用了return
會報錯,感覺在這段代碼中break與return應該能起到相同的作用才對。請大佬們指教
package main
import "fmt"
func putNum(intChan chan int){
for i:=1;i<=80;i++{
intChan<-i
}
close(intChan)
}
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){
for {
var flag bool=true
v,ok:=<-intChan
if !ok{
break
}
for i:=2;i<v;i++{
if v%i==0{
flag=false
break
}
}
if flag{
primeChan<-v
}
}
exitChan<-true
}
func main(){
intChan:=make(chan int,800)
primeChan:=make(chan int,600)
exitChan:=make(chan bool,4)
go putNum(intChan)
for i:=1;i<=4;i++{
go primeNum(intChan,primeChan,exitChan)
}
go func(){
for i:=1;i<=4;i++{
<-exitChan
}
close(primeChan)
close(exitChan)
}()
for {
v,ok:=<-primeChan
if !ok{
break
}
fmt.Println(v)
}
}
uj5u.com熱心網友回復:
這個報錯是說死鎖了。原因應該是因為修改14行的break為return之后,當putNum讀到最后一個數之后關閉intChan,primeNum函式14行直接return,沒有向exitChan中傳值。導致main中,從exitChan接收四次bool值的操作阻塞。致使死鎖。
可以修改
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){
...
exitChan<-true
}
為
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){
defer func() {
exitChan<-true
}()
...
}
這樣修改break為return應該就沒有問題了。
uj5u.com熱心網友回復:
明白了,之前沒意識到return是將整個putNum函式退出。看來return和break還是不能隨便混用的。謝謝大佬!
uj5u.com熱心網友回復:
嗯嗯,,,這個屬于是代碼規范程度的問題,uj5u.com熱心網友回復:
break只能退出本層回圈,如果是多個回圈嵌套,就要注意了,例如for{
select {
case <-ch:
break
}
}
以上break只能跳出select,不能跳出for,如果要跳出for,可以
Label:
for{
select {
case <-ch:
break Label
}
}
Label:只能定義在for前面,如果要想定義在后面,可以用goto 陳述句
for{
select {
case <-ch:
break
}
}
以上break只能跳出select,不能跳出for,如果要跳出for,可以
Label:
for{
select {
case <-ch:
goto Label
}
}
Label:
uj5u.com熱心網友回復:
break只能退出本層回圈,如果是多個回圈嵌套,就要注意了,例如for{
select {
case <-ch:
break
}
}
以上break只能跳出select,不能跳出for,如果要跳出for,可以
Label:
for{
select {
case <-ch:
break Label
}
}
Label:只能定義在for前面,如果要想定義在后面,可以用goto 陳述句
for{
select {
case <-ch:
goto Label
}
}
Label:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/28316.html
標籤:go語言
上一篇:關于python串列洗掉其中元素的一個新手問題 求教
下一篇:單片機時鐘 有沒有大神幫忙看下
