猿问

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

有没有(非破坏性)方法来列出缓冲通道中的所有元素?

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

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


慕桂英4014372
浏览 159回答 3
3回答

蝴蝶刀刀

2011 年的这个线程提供了一些围绕通道的包装器以启用 Peek() 函数,但这更像是一种解决方法。type PeekChanInt struct {&nbsp; &nbsp; &nbsp; &nbsp; in <-chan int&nbsp; &nbsp; &nbsp; &nbsp; out chan int}一般的结论是:同步通道没有头(就像一个零长度的切片)你不能这样做,因为a) 它被放回到队列的尾部而不是尾部并且b) 一个作者可能先到了那里,所以 put 可能会阻塞。过去我一直想要这样的功能。当通道只有一个消费者时,这是有意义的(我希望它在决定是否消费之前先查看第一个鼠标事件以进行命中测试)您可以使用充当中介的进程来模拟它,但是您必须为每个通道类型都这样做,否则会失去类型安全性。请记住,没有缓冲,因此如果您偷看某个值,则必须从另一侧获取该值,这相当于读取它 - 但这是错误的,因为偷看应该没有副作用。

神不在的星期二

不,你不能,如果你想这样做,你可以根据列表编写自己的阻塞队列。
随时随地看视频慕课网APP

相关分类

Go
我要回答