当我执行一些go实践代码时,遇到一个问题,通道可以关闭两次,如下所示:
输出:
但是,当我手动关闭两次通道时,得到了
为什么上面的代码可以两次关闭?
一个通道只能关闭一次,尝试关闭一个已关闭的通道紧急情况。
但是从封闭渠道接收的信息不受限制,从封闭渠道接收信息是:
A receive operation on a closed channel can always proceed immediately, yielding the element type's zero value after any previously sent values have been received.
Go应用程序一直运行到它的主要goroutine运行(在"正常"情况下)为止,或者从另一个角度来看:Go应用程序在其主要goroutine终止时终止,即
您启动了带有无限
通常使用
当然,这将在您的情况下导致死锁,因为永远不会到达循环主体,因为没有人在
去通道不关闭twise。您的传递通过<-第一次打印后为true
所以印了两次
如果在打印之前使用done <-true,则它将仅打印一次,将关闭。
输出:
当goroutine触发时,它不会立即开始运行。而是,程序控制转到此部分:
并且
现在发生上下文切换,goroutine开始运行。它从关闭的
但是,循环能够再次执行,并且goroutine块将在