gpt4 book ai didi

go - 在 Go 中关闭 channel

转载 作者:IT王子 更新时间:2023-10-29 02:27:43 27 4
gpt4 key购买 nike

我正在学习 Go 中的 channel 如何工作,并且偶然发现了关闭 channel 的问题。这是 A Tour of Go 中的修改示例,它生成 n-1 个斐波那契数并通过 channel 发送它们,留下未使用的 channel 容量的最后一个“元素”。

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)
}
}

问题是我得到:

fatal error: all goroutines are asleep - deadlock!

当我不关闭 channel 时。到底是什么导致了僵局?为什么我不关闭 channel 却无法在其容量边界内接收到它?

最佳答案

您正在将 n 个值写入 channel (从 0 到 n-1),但正在尝试读取 n+1来自 channel 的值(从 0 到 n)。在没有明确关闭 channel 的情况下,main函数将永远等待最后一个值。

What exactly is causing the deadlock?

n 次迭代后,goroutine 运行 fibonacci功能将退出。在这个 goroutine 退出后,你的程序中唯一剩下的 goroutine 是 main。 goroutine,这个 goroutine 正在等待一些数据被写入 c channel —— 因为没有其他 goroutine 可以将数据写入这个 channel ,所以它将永远等待。这正是错误消息试图告诉您的内容:“所有 goroutines(此处“all”只是“一个”)都睡着了”

_, ok := <- c调用main函数只会在 c 时停止阻塞。 channel 已关闭(因为从 channel 读取是阻塞的,这需要从另一个 goroutine 完成)。当 channel 关闭时,main函数将从 channel 中读取剩余数据(当它是缓冲 channel 时)

关于go - 在 Go 中关闭 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36676834/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com