既然dc里的值是顺序执行的,为什么不可以用for vid:=range(dc)来取呢?

来源:5-5 task示例的实现

sd1700092

2018-06-27

老师前几节课说不能用range取channel的里的值,不是很同意呀。。

感觉用range也是可以的,因为业务逻辑好像就是顺序放,再顺序取的。(这点runner_test.go里面已经表现出来了)

而且用range也就不用加forloop标签跳出for循环了,整体看上去更简洁些。

写回答

1回答

艾文西

2018-06-27

for range是同步调用,阻塞的。

而select是非阻塞,异步的轮询,因此在很多场景下range出来的channel内消息会出现跟预期结果不一致的情况。比如在用timer做定时器的时候,就会出现延迟,并且延迟还会叠加。

select是非常安全也高效的做法,所以我们推荐用select而不是用range

1
1
sd1700092
非常感谢!
2018-06-28
共1条回复

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程