对封锁频道感到困惑

时间:2018-09-19 20:13:21

标签: go

我有这段代码应该在程序退出之前等待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操场上运行时不会等待10秒钟:

package main

import (
    "time"
)

func main() {
    forever := make(chan bool)
    go func() {
        time.Sleep(10 * time.Second)
        forever <- false
    }()
    <-forever
}

1 个答案:

答案 0 :(得分:5)

从技术上讲,这是游乐场的“特色”。当一切都被阻塞在操场上准时等待时,时间会人为地增加,直到事物解开……或者它决定事物真的陷入僵局。请参见Golang Playground article中的“浮空时间”部分。