当前位置: 首页 > 面试题库 >

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

徐新荣
2023-03-14
问题内容

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

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

链接到游乐场

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)作家可能首先到达那里,所以看跌期权可能会受阻。

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

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

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



 类似资料:
  • 默认情况下,通道是不带缓冲区的。 发送端发送数据,同时必须又接收端相应的接收数据。 而带缓冲区的通道则允许发送端的数据发送和接收端的数据获取处于异步状态,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。 不过由于缓冲区的大小是有限的,所以还是必须有接收端来接收数据的,否则缓冲区一满,数据发送端就无法再发送数据了。 package main imp

  • 主要内容:创建带缓冲通道,阻塞条件Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。 这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进

  • Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。 如果两个 goroutine 没有同时准备好,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。这种对通道进行发送和接收的交互行为本身就是同步的。其中任意一个操作都无法离开另一

  • 我读到我可以在缓存更新时驱逐整个缓存,但我想避免类似的事情: 有什么方法可以在缓存的集合中创建/更新/删除值吗?还是将集合中的所有值缓存为单个键?

  • 问题内容: 我正在尝试创建一个异步通道,并且一直在查看http://golang.org/ref/spec#Making_slices_maps_and_channels。 缓冲区大小为10是什么意思?缓冲区大小具体代表/限制了什么? 问题答案: 缓冲区大小是在没有发送阻塞的情况下可以发送到通道的元素数。默认情况下,通道的缓冲区大小为0(可通过来获得此值)。这意味着每个发送都会阻塞,直到另一个go

  • 我使用YouTube数据API从一个频道获取视频信息。API响应不包括上传到相应频道的所有视频。 这是频道(现在有6个视频):https://www.youtube.com/channel/UCdSjDEx46aNP0oKPN_J6hOA/videos 视频列表(现在):https://i.ibb.co/K91bJxS/image.png 这是我的API调用:https://www.googlea