我正在学习 Go 中通道的工作方式,并偶然发现了关闭通道的问题。这是来自A Tour of Go的修改示例,它生成 n-1 斐波那契数并通过通道发送它们,使通道容量的最后一个“元素”未使用。
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n-1; i++ {
c <- x
x, y = y, x+y
}
// close(c) // It's commented out on purpose
}
func main() {
n := 10
c := make(chan int, n)
go fibonacci(n, c)
for i := 0; i < n; i++ {
_, ok := <-c
fmt.Println(ok)
}
}
问题是我得到:
致命错误:所有 goroutine 都处于睡眠状态 - 死锁!
当我不关闭频道时。究竟是什么导致了死锁?当我不关闭它时,为什么我不能在其容量边界内从通道接收?
千巷猫影
慕姐4208626
相关分类