【发布时间】:2020-05-02 03:21:33
【问题描述】:
接收者总是阻塞,直到有数据要接收
这个测试应该失败,因为对于来自通道的最后接收操作没有相应的写入:
package main
import "fmt"
func main() {
c := make(chan int)
for i := 0; i < 4; i++ { // 4 async reads
go func() {
fmt.Println("received:", <-c)
}()
}
// just 3 writes, 1 write is missing
c <- 1
c <- 2
c <- 3
}
但是脚本在读取 goroutine 中没有失败并显示错误消息,但它成功打印了 3 个值:
收到:1 收到:2 收到:3
为什么会这样,或者我对同步有误解?
【问题讨论】:
-
"这个测试应该失败,因为从一个通道的最后接收操作没有相应的写入",为什么测试会失败?确实“没有相应的写入”,但测试确实没有来检查通道上的任何尝试接收是否已完成。
-
在我看来,至少运行时可以告诉用户有多少 goroutine 在退出程序时终止而没有接收到数据。 IE。我期待信息性消息。我认为它会增加价值
-
很遗憾,您的意见与 Go 的工作方式不符。