是否有一种(非破坏性的)方式列出缓冲通道中的所有元素?
我唯一能想到的就是循环所有这些,最后将它们重新插入。这似乎不是最聪明的方法。
链接到游乐场
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))
从2011年开始,该线程在通道周围提供了一些包装程序,以启用Peek()函数,但这比其他任何方法都更可行。
type PeekChanInt struct { in <-chan int out chan int }
总的结论是:
同步通道没有头(就像零长度切片) 你不能那样做,因为 a)它被放回队列的尾部而不是末端,并且 b)作家可能首先到达那里,所以看跌期权可能会受阻。 过去我一直想要这样的功能。当只有一个频道的使用者时,这是有道理的(我希望它窥视第一个鼠标事件以进行命中测试,然后再决定是否使用它) 您可以使用充当中介的进程来模拟它,但是您必须针对每种通道类型执行此操作,否则将失去类型安全性。 请记住,没有缓冲,因此,如果窥视某个值,则必须从另一侧获取该值,这等同于读取该值-但这是错误的,因为 窥视应该没有副作用 。
同步通道没有头(就像零长度切片)
你不能那样做,因为
过去我一直想要这样的功能。当只有一个频道的使用者时,这是有道理的(我希望它窥视第一个鼠标事件以进行命中测试,然后再决定是否使用它)
您可以使用充当中介的进程来模拟它,但是您必须针对每种通道类型执行此操作,否则将失去类型安全性。
请记住,没有缓冲,因此,如果窥视某个值,则必须从另一侧获取该值,这等同于读取该值-但这是错误的,因为 窥视应该没有副作用 。