为了账号安全,请及时绑定邮箱和手机立即绑定

列出缓冲通道中的所有元素

列出缓冲通道中的所有元素

Go
慕桂英4014372 2021-08-16 20:04:12
有没有(非破坏性)方法来列出缓冲通道中的所有元素?我唯一能想到的就是循环所有这些,最后重新插入它们。这似乎不是最聪明的方法。c := make(chan int, 100)c <- 111c <- 222for i:=0;i<2;i++ {element := <- cfmt.Println(element)c <- element}fmt.Println(len(c))
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

2011 年的这个线程提供了一些围绕通道的包装器以启用 Peek() 函数,但这更像是一种解决方法。


type PeekChanInt struct {

        in <-chan int

        out chan int

}

一般的结论是:


同步通道没有头(就像一个零长度的切片)


你不能这样做,因为


a) 它被放回到队列的尾部而不是尾部并且

b) 一个作者可能先到了那里,所以 put 可能会阻塞。

过去我一直想要这样的功能。当通道只有一个消费者时,这是有意义的(我希望它在决定是否消费之前先查看第一个鼠标事件以进行命中测试)


您可以使用充当中介的进程来模拟它,但是您必须为每个通道类型都这样做,否则会失去类型安全性。


请记住,没有缓冲,因此如果您偷看某个值,则必须从另一侧获取该值,这相当于读取它 - 但这是错误的,因为偷看应该没有副作用。


查看完整回答
反对 回复 2021-08-16
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

不,你不能,如果你想这样做,你可以根据列表编写自己的阻塞队列。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信