我正在學習頻道如何在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)
}
}
的問題是,我得到:
fatal error: all goroutines are asleep - deadlock!
當我不關閉通道。究竟是什麼導致了僵局?爲什麼當我不關閉它時,我無法從容量邊界的頻道接收?
如果您期望關閉某個通道,則讀取通道的習慣方式爲:for v:=範圍c {'因爲您不需要檢查確定 - 當通道關閉時,for循環將會退出。如果你不希望頻道關閉,請使用'for {select {case v:= < - c:...'。這樣你可以有額外的'case'條件,例如超時,監視取消令牌等等,並且在檢測到退出條件時打破for循環。 – eduncan911