“睡眠”
您可以使用许多永久阻塞的构造,而不会“吃掉” CPU。
例如,
select不带任何
case(且不带
default)的a:
select{}或从没有人发送任何东西的渠道接收:
<-make(chan int)
或从
nil频道接收也会永远阻止:
<-(chan int)(nil)
或在
nil频道上发送也会永远被阻止:
(chan int)(nil) <- 0
或锁定已经锁定的
sync.Mutex:
mu := sync.Mutex{}mu.Lock()mu.Lock()戒烟
如果您确实想提供一种退出方法,则可以通过一个简单的渠道来完成。提供一个
quit频道,并从中接收。当您要退出时,请关闭
quit通道,因为“
关闭的通道上的接收操作始终可以立即进行,在接收到任何先前发送的值之后,将产生元素类型的零值
”。
var quit = make(chan struct{})func main() { // Startup pre... // Then blocking (waiting for quit signal): <-quit}// And in another goroutine if you want to quit:close(quit)请注意,发出
close(quit)可能会随时终止您的应用。引用规范:程序执行:
程序执行首先初始化主程序包,然后调用函数
main。当该函数调用返回时,程序退出。 它不等待其他(非main)goroutine完成。
当
close(quit)被执行时,我们的最后一条语句
main()的功能可以继续在该装置
main够程可以返回,所以程序退出。



