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'); 老师主要教的应该还都是先写触发读,我的理解哪边出了偏差?还是说没有箭头实际上写触发读?

相关截图:

https://img.mukewang.com/climg/62a626d809e379b808620674.jpg

2. close操作没有看懂,close之后,sleep 1min,实际上go worker()还是一直在触发,1min后程序结束,只不过c是空的,worker()方法通过 for n: = range c过滤了空值,但为什么触发了receive呢?经过测试发现是close(c)触发,就更困惑了

相关截图:

https://img.mukewang.com/climg/62a6285309d8385f09600520.jpghttps://img.mukewang.com/climg/62a629320903fea210840320.jpg

写回答

1回答

ccmouse

2022-06-19

第一个问题,缓冲区的引入没有改变执行的逻辑,只是把原来会阻塞的代码变得不阻塞。收到的数据的先后关系还是一样的。这里可能问题有误,并没有看到发送0。第一个发送的是'a',所以第一个应当收到'a'。

第二个问题,for n:=range c的作用是不断从c里接收数据,每收到一个数据就进入循环体,执行fmt.Printf。这个for循环在channel被close时结束。

0

0 学习 · 1399 问题

查看课程