一尘不染

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

go

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

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

链接到游乐场

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))

阅读 139

收藏
2020-07-02

共1个答案

一尘不染

从2011年开始,线程在通道周围提供了一些包装程序,以启用Peek()函数,但这比其他任何方法都更可行。

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

总的结论是:

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

你不能那样做,因为

  • a)它被放回队列的尾部而不是末端,并且
  • b)作家可能首先到达那里,所以看跌期权可能会受阻。

过去我一直想要这样的功能。当只有一个频道的使用者时,这是有道理的(我希望它窥视第一个鼠标事件以进行命中测试,然后再决定是否使用它)

您可以使用充当中介的进程来模拟它,但是您必须针对每种通道类型执行此操作,否则将失去类型安全性。

请记住,没有缓冲,因此,如果窥视某个值,则必须从另一侧获取该值,这等同于读取该值-但这是错误的,因为 窥视应该没有副作用

2020-07-02