我试图让我的Go程序永远阻止,但没有任何工作。
以下是我尝试过的一些事情:
package main
func main() {
select{}
}
和
package main
func main() {
ch := make(chan bool)
<-ch
}
和
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
wg.Wait()
}
每次我收到同样的错误:fatal error: all goroutines are asleep - deadlock!
我以为我之前很容易做到这一点。我可以让go程序永远阻止吗?
答案 0 :(得分:4)
如果你产生了另一个goroutine(除了阻止之外的其他东西),那些方法会起作用
您问题的直接解决方法是:
time.Sleep(math.MaxInt64)
将睡眠〜300年
答案 1 :(得分:2)
例如,main
goroutine永远阻止,
package main
import (
"fmt"
"time"
)
func forever() {
for {
fmt.Println(time.Now().UTC())
time.Sleep(time.Second)
}
}
func main() {
go forever()
select {} // block forever
}
输出:
2017-08-05 02:50:10.138353286 +0000 UTC
2017-08-05 02:50:11.138504194 +0000 UTC
2017-08-05 02:50:12.138618149 +0000 UTC
2017-08-05 02:50:13.138753477 +0000 UTC
2017-08-05 02:50:14.13888856 +0000 UTC
2017-08-05 02:50:15.139027355 +0000 UTC
...
...
...
答案 2 :(得分:1)
对于“如何让Go程序永远阻止”的问题,已经有使用for循环或time.Sleep
的答案。
但我想回答“如何让一个Go程序永远阻止使用一个永远不会收到值的频道”。
package main
func main() {
ch := make(chan bool)
go func(c chan bool) {
for {
}
c <- true // Because c never receives true,
}(ch)
<-ch // thus ch waits forever.
}
我认为上面的示例代码可以帮助理解Go程序阻止通道的原因和时间。