有没有(非破坏性)方法来列出缓冲通道中的所有元素?我唯一能想到的就是循环所有这些,最后重新插入它们。这似乎不是最聪明的方法。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 可能会阻塞。
过去我一直想要这样的功能。当通道只有一个消费者时,这是有意义的(我希望它在决定是否消费之前先查看第一个鼠标事件以进行命中测试)
您可以使用充当中介的进程来模拟它,但是您必须为每个通道类型都这样做,否则会失去类型安全性。
请记住,没有缓冲,因此如果您偷看某个值,则必须从另一侧获取该值,这相当于读取它 - 但这是错误的,因为偷看应该没有副作用。
- 3 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消