chan应该先读后写还是先写后读
来源:6-1 channel
qq_永远的稻米_0
2022-06-13 02:09:38
1. 结合网上,我理解是chan<-是写(Send),<-是读(Receive), 注释部分,创建chan之后没有设立size缓冲区,goroutine之后fmt.Println(<-c),那实际上是先写在读,这个没有顺序的么,读的时候触发写操作go func(){}(),我按顺序我以为是0,结果是97('a'); 老师主要教的应该还都是先写触发读,我的理解哪边出了偏差?还是说没有箭头实际上写触发读?
相关截图:
2. close操作没有看懂,close之后,sleep 1min,实际上go worker()还是一直在触发,1min后程序结束,只不过c是空的,worker()方法通过 for n: = range c过滤了空值,但为什么触发了receive呢?经过测试发现是close(c)触发,就更困惑了
相关截图:
1回答
ccmouse
2022-06-19
第一个问题,缓冲区的引入没有改变执行的逻辑,只是把原来会阻塞的代码变得不阻塞。收到的数据的先后关系还是一样的。这里可能问题有误,并没有看到发送0。第一个发送的是'a',所以第一个应当收到'a'。
第二个问题,for n:=range c的作用是不断从c里接收数据,每收到一个数据就进入循环体,执行fmt.Printf。这个for循环在channel被close时结束。
相似问题