首页 > 解决方案 > 对阻塞频道感到困惑

问题描述

我有这段代码应该在程序退出前等待 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
}

标签: go

解决方案


从技术上讲,这是游乐场的“特色”。当在操场上按时等待一切都被阻塞时,时间会人为地推进,直到事情解除……或者它决定事情真的陷入僵局。请参阅Golang Playground 文章中的“伪造时间”部分。


推荐阅读