新手求教,关于return与break区分的问题

m0_38130725 2020-01-10 12:14:44
这是一段求素数的代码,是可以正常运行的。但是当我把第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)     } }
...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ying1234 2020-07-02
  • 打赏
  • 举报
回复
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:
ying1234 2020-07-02
  • 打赏
  • 举报
回复
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:
  • 打赏
  • 举报
回复
嗯嗯,,,这个属于是代码规范程度的问题,
m0_38130725 2020-01-10
  • 打赏
  • 举报
回复
引用 1 楼 gaorx1019的回复:
这个报错是说死锁了。 原因应该是因为修改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应该就没有问题了。
明白了,之前没意识到return是将整个putNum函数退出。看来return和break还是不能随便混用的。谢谢大佬!
gaorx1019 2020-01-10
  • 打赏
  • 举报
回复
这个报错是说死锁了。 原因应该是因为修改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应该就没有问题了。

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧