小编典典

等待执行例程的正确方法

go

我想知道退出程序之前等待go例程完成的正确方法是什么。阅读其他答案,看来bool
chan可以解决问题,就像在Playground链接中一样

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}

func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
    //<-done
}

我在这里有两个问题:

  • 为什么<-完成的作品完全可以?

  • 如果我取消最后一行的注释会怎样?我有一个死锁错误。这是因为通道为空,并且没有其他函数向其发送值吗?


阅读 308

收藏
2020-07-02

共1个答案

小编典典

为何<- done一切正常?

  • 之所以有效,是因为运行时检测到您正在向其他地方的通道写入内容。

如果我取消最后一行的注释会怎样?

  • 运行时足够聪明,可以知道没有其他东西在写,而且会死锁。

值得一提的是,如果您的内存非常有限,则可以使用done := make(chan struct{})done <- struct{}{}struct{}以确保使用0个内存。

2020-07-02