私はチャンネルがGoでどのように動作するのかを学習しており、チャンネルを閉じる際に問題が発生しました。これは、の修正された例です。のn-1個のフィボナッチ数を生成してチャネルに送信し、チャネル容量の最後の「要素」は使用しないままにします。Goでチャンネルを閉じる
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!
私はチャネルを閉じていないとき。デッドロックの原因は何ですか?私がそれを閉じないと、容量の境界でチャンネルから受信できないのはなぜですか?チャンネル内の主な期待n個の通信におけるループのために
FYI、チャンネルを閉じることを期待している場合、範囲を確認する必要はありませんので、チャンネルを閉じるとループが終了します。あなたがチャンネルを閉じることを期待していないなら、 'for {select {case v:= < - c:...} 'を使用してください。そうすれば、タイムアウト、トークンキャンセルの監視などの追加の 'case '条件を持つことができ、終了条件が検出されたときにforループを解除することができます。 – eduncan911