我有一个问题,这里发生了什么?
forever := make(chan bool)
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
这段代码创建了一个非缓冲通道,并尝试从中接收数据。
由于没有人向通道发送任何数据,因此它实际上是一个永久阻塞的操作。
这样做的目的是防止goroutine结束/返回,最有可能是因为还有其他goroutine同时工作或等待某些事件或消息到来(就像你的日志信息所说的那样)。
而这样做的必要性在于如果不这样做,应用程序可能会在不等待其他goroutine的情况下退出。换句话说,如果main
goroutine结束,程序也会结束。引用自规范:程序执行:
程序的执行从初始化主包开始,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非
main
)goroutine 完成。
查看这个答案以获取类似和更多的技术:Go项目的 main goroutine 永久睡眠?
有关通道的介绍,请参见通道的用途是什么?
[s,d]trace
命令跟踪该进程。您将发现,icza 在他的回答中所说的正是正在发生的事情:“<-forever” 是一个阻塞操作。同样,“forever<-true” 也会被阻塞(因为没有例程从通道中读取)。 - Elias Van Ootegem