请稍等 ...
×

采纳答案成功!

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

chan是严格的先进先出吗?我可以借助chan实现队列吗?

我想直接用chan来实现一个队列,带push和pop功能

正在回答

1回答

ccmouse 2019-04-07 17:43:09

一个不带buffer的channel一次只能传递一个数据,当然从发送方和接收方来看,的确是“先进先出”的行为,只不过会阻塞。

带buffer的channel(我在channle那章有说到)是真的先进先出,而且下面的buffer满之前不会阻塞。

那么最后,其实我们还是不要用chan来当队列用,原因就是会阻塞,即使有buffer也只是减缓了阻塞的发生。可以参考一下我的实战代码,https://git.imooc.com/coding-180/coding-180/src/master/crawler/scheduler/queued.go#L23

及时的从chan收数据,减小阻塞,随后放到由slice来实现的队列里。


0 回复 有任何疑惑可以回复我~
  • 提问者 脑子笨学不会 #1
    已经预定义了一个有buffer的chan,向chan中发送数据,然后再次给这个chan来make更大的空间,之前chan中的数据会全部丢失对吗?
    有什么办吧能在不丢失之前数据的前提下扩展chan的buffer大小?
    如果能保证带buffer的chan不被装满阻塞,就完全可以用chan来当队列吗?
    回复 有任何疑惑可以回复我~ 2019-04-07 18:58:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信