猿问

对阻塞通道感到困惑

我有这段代码应该在程序退出前等待 10 秒,但它只有在我之后为它添加某种打印内容时才有效。这是为什么?我希望它等待 10 秒,而不必取消对该打印语句的注释。


func main() {


  forever := make(chan bool)

  go func() {

    fmt.Println("why")

    time.Sleep(10*time.Second)

    //fmt.Println("here")

    forever <- false

  }()

  fmt.Println("forever")

  <- forever


}

这也有效:


func main() {


  forever := make(chan bool)

  go func() {

    fmt.Println("why")

    time.Sleep(10*time.Second)

    forever <- false

  }()

  fmt.Println(<- forever)


}

以下程序在 Go playground 中运行时不会等待 10 秒:


package main


import (

    "time"

)


func main() {

    forever := make(chan bool)

    go func() {

        time.Sleep(10 * time.Second)

        forever <- false

    }()

    <-forever

}


胡说叔叔
浏览 83回答 1
1回答

桃花长相依

从技术上讲,它是游乐场的“特色”。当一切都被阻塞在操场上准时等待时,时间会人为地推进直到事情解除阻塞……或者它决定事情真的陷入僵局。
随时随地看视频慕课网APP

相关分类

Go
我要回答