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