初级会员
  • 第 56068 位会员
  • lihongbin
  • 2020-08-27 13:25:11
  • Offline
  • 20 6

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 给两个小建议吧 1、关闭的channel可以用for range 来循环,所以最后打印素数的时候,可以写成 ```go for key := range resultChan { fmt.Printf("素数:%v\n", key) } ``` 2、写代码的时候,最好业务跟逻辑分离处理,比如把判断是否是素数的方法拆出来 ```go func judgData(intChan chan int, resultChan chan int, exitChan chan bool) { for { num, ok := <-intChan if !ok { fmt.Println("数据读取完毕") break } if isPrime(num) { resultChan <- num } } exitChan <- true fmt.Println("一个协程执行完毕") } func isPrime(n int) bool { if n < 2 { return false } for i := 2; i*i <= n; i++ { if n%i == 0 { return false } } return true } ``` 其他的就是一些个人习惯了,练习项目都无所谓 * 比如多个相邻的变量声明,我喜欢用var()包起来 * 比如多次用到的值,可以用常量代替 * 比如开多个协程的时候,我习惯用WaitGroup或Context来处理
  • ```go // flag := true放到循环里面,为啥我也不知道 // resultChan <- num 写入判断逻辑放到内层for循环外面,这个原来的判断逻辑有问题 func judgData(intChan chan int, resultChan chan int, exitChan chan bool, done func()) { defer done() time.Sleep(time.Millisecond * 1000) //time.Sleep(time.Second *1) for { flag := true num, ok := <-intChan if !ok { fmt.Println("已从intChan读取所有数据") break } for i := 2; i < num; i++ { if num%i == 0 { flag = false break } } if flag { resultChan <- num fmt.Printf("添加%v到resultChan\n", num) } } fmt.Println("协程执行完毕") exitChan <- true } ```