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

时间:2014-09-25 18:40:44

标签: go channel

是否有(非破坏性)方式列出缓冲通道中的所有元素?

我唯一能想到的就是循环所有这些,最后重新插入它们。这似乎不是最明智的方法。

Link to playground

c := make(chan int, 100)
c <- 111
c <- 222
for i:=0;i<2;i++ {
element := <- c
fmt.Println(element)
c <- element
}
fmt.Println(len(c))

3 个答案:

答案 0 :(得分:4)

不,你不能,你可以根据列表编写自己的阻塞队列。

答案 1 :(得分:4)

为了启用Peek()函数,这个thread from 2011为一个通道提供了一些包装器,但这更像是一种解决方法而不是其他任何东西。

type PeekChanInt struct {
        in <-chan int
        out chan int
}

总的结论是:

  

同步通道没有头(它像零长度切片)

     

你不能那样做,因为

     
      
  • a)它被放回队列的尾部而不是结尾和
  •   
  • b)作家可能先到达那里,所以看跌可能会阻止。
  •   
     

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

     

您可以使用充当中介的流程来模拟它,但您必须为每种渠道类型执行此操作或丢失类型安全。

     

请记住,没有缓冲,所以如果你偷看一个值,你必须从另一方获得价值,这相当于阅读它 - 但这是错误的,因为偷看应该没有副作用

答案 2 :(得分:1)

你真的不可能。你拥有的是唯一的方法,但是如果有chan的任何并发访问权限,那么就不要这样做(那你为什么要使用陈?)。

检查len后,以及for循环期间,可以插入或删除项目。