是否有(非破坏性)方法列出缓冲通道中的所有元素?
我唯一能想到的就是循环所有这些,最后重新插入它们.这似乎不是最聪明的方法.
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))
Run Code Online (Sandbox Code Playgroud)
2011 年的这个线程提供了一些围绕通道的包装器,以便启用 Peek() 函数,但这更多的是一种解决方法。
type PeekChanInt struct {
in <-chan int
out chan int
}
Run Code Online (Sandbox Code Playgroud)
总体结论是:
同步通道没有头(就像零长度切片)
你不能那样做,因为
- a)它被放回队列的尾部而不是末尾并且
- b) 写入者可能先到达那里,因此 put 可能会阻塞。
我过去就想要这样的功能。当通道只有一个消费者时,这是有意义的(我希望它在决定是否使用它之前查看第一个鼠标事件以进行命中测试)
您可以使用充当中介的进程来模拟它,但您必须为每种通道类型执行此操作,否则会失去类型安全性。
请记住,没有缓冲,因此如果您查看某个值,则必须从另一端获取该值,这相当于读取它 - 但这是错误的,因为查看应该没有副作用。