如何让Go程序永远阻止

时间:2017-08-05 01:58:42

标签: go

我试图让我的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程序永远阻止吗?

3 个答案:

答案 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程序阻止通道的原因和时间。

相关问题