请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

10-1 channel 为什么要写死循环

package main

import (
   "fmt"
   "time"
)

func main() {
   Demo()
}

func worker(id int, c chan int) {
   for {
      fmt.Println("ha??")
      fmt.Printf("worker %d received %d \n", id, <-c)
      fmt.Println("ha!!")

   }
}

func Demo() {
   c := make(chan int, 3)
   c <- 1
   c <- 2
   c <- 3
   for i := 0; i < 10; i++ {
      go worker(i, c)
   }
   time.Sleep(time.Millisecond)

}

请问,worker函数里为什么要写for死循环来执行打印?外面起了10个携程,去掉for死循环结果也是一样的吧?

如果用死循环,生成无限个channel阻塞(<-c)  是不是也损耗资源呢?

还有我的理解顺序是否正确:worker里面的打印会先阻塞掉,等待channel写入。当c<-1,c<-2,c<-3,有写入的时候,上面阻塞掉的携程被唤醒,执行打印。


麻烦老师给与讲解。多谢

正在回答

1回答

smilerr 2018-02-06 21:31:29

写死循环是为了一直等待去接收数据,因为产生数据时间是不确定的,只能接收到一个数据之后,继续等待接收数据,在网络接口部分实现也是一个死循环等待请求数据,这里死循环理解成一直等待就行

2 回复 有任何疑惑可以回复我~
  • 提问者 weibo_隱懓_0 #1
    对性能没有影响吗?
    回复 有任何疑惑可以回复我~ 2018-02-06 21:46:06
  • smilerr #2
    没有,因为在循环里面是阻塞的,一直等待!并不是一直轮询
    回复 有任何疑惑可以回复我~ 2018-02-06 23:16:29
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信