我正在阅读RabbitMQ tutorial并看到以下代码:
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
我感兴趣的是for d := range msgs
。这个for循环如何处理事件?例如。在应用程序启动时,我在msgs
队列缓冲区中只有一条消息。
问题:
log.Printf
行,并且不再处理事件。可能是什么原因? 答案 0 :(得分:1)
- 如何处理下一个活动?
醇>
除了对基本数据结构的迭代之外,GoLang中的range还可以迭代从通道接收的值。范围在从队列接收时迭代每个元素,并且仅在信道关闭时结束。 当通道(msgs)将接收值
时,将发生下一次迭代msgs <- message
- 在玩了一些代码之后,我发现它可能会停留在log.Printf行上,并且不再处理事件。可能是什么原因?
醇>
考虑到blocking channel forever
并且我们有一个范围在msgs
频道上进行迭代,可能会有两种可能的操作:
要么
通过msgs频道发送消息
msgs&lt; - message
或
将值发送到forever
,以便取消阻止流程
永远&lt; - false
似乎该解决方案旨在等待并通过渠道异步处理消息。