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 Playground 中运行时不会等待 10 秒:
package main
import (
"time"
)
func main() {
forever := make(chan bool)
go func() {
time.Sleep(10 * time.Second)
forever <- false
}()
<-forever
}
解决方案
从技术上讲,这是游乐场的“特色”。当在操场上按时等待一切都被阻塞时,时间会人为地推进,直到事情解除……或者它决定事情真的陷入僵局。请参阅Golang Playground 文章中的“伪造时间”部分。
推荐阅读
- openshift - Openshift 部署——fabric8 或模板
- c++ - 为什么这个正则表达式会“冻结”VC++ 中的程序?
- c# - ToList 方法不显示
- node.js - 非阻塞 I/O 如何与通道一起使用
- java - Spring Boot Test 无法使用 LocalServerPort 注释自动连接端口
- docker - 带有 ssh 的 Docker exec 没有给出这样的容器错误
- windows-10 - 从 ms 商店完成 Windows 10 上的 Linux 子系统安装失败
- c++ - 如何在预编译之后和使用 CMake 编译之前插入脚本?
- json - Jackson Serializer 调用了错误的类型
- .net - vb.Net-命名管道-NamedPipeServerStream-StackOverflowException