Golang:永久通道

7

我有一个问题,这里发生了什么?

forever := make(chan bool)

log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever

打开一个 delve 会话并反汇编,或者只需使用 [s,d]trace 命令跟踪该进程。您将发现,icza 在他的回答中所说的正是正在发生的事情:“<-forever” 是一个阻塞操作。同样,“forever<-true” 也会被阻塞(因为没有例程从通道中读取)。 - Elias Van Ootegem
2
通道在优秀的Go 之旅中得到了全面的介绍。 - Adrian
1个回答

18

这段代码创建了一个非缓冲通道,并尝试从中接收数据。

由于没有人向通道发送任何数据,因此它实际上是一个永久阻塞的操作。

这样做的目的是防止goroutine结束/返回,最有可能是因为还有其他goroutine同时工作或等待某些事件或消息到来(就像你的日志信息所说的那样)。

而这样做的必要性在于如果不这样做,应用程序可能会在不等待其他goroutine的情况下退出。换句话说,如果main goroutine结束,程序也会结束。引用自规范:程序执行:

程序的执行从初始化主包开始,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非main)goroutine 完成。

查看这个答案以获取类似和更多的技术:Go项目的 main goroutine 永久睡眠?

有关通道的介绍,请参见通道的用途是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接