← Go コース
49. close と range — チャネルを閉じて受信を終える
送信側はもう値を送らないことを close(ch) で受信側に伝えられます。閉じたチャネルからの受信は、残っている値をすべて取り出した後はゼロ値を返します。v, ok := <-ch の ok が false になることでも閉じたと判定できます。
for v := range ch と書くと、チャネルが閉じられて値がなくなるまで自動で受信を続けます。close を呼ばないまま range すると受信し続けてデッドロックになるため、送信が終わったら必ず閉じるのが定石です。なお閉じるのは送信側の責任で、受信側は閉じません。
下の例では goroutine が値を送り終えて close し、main が range で受け切ります。送信した値を漏れなく集計するので、合計は毎回同じになります。
▶ サンプルコードを実行してみよう(自由に書き換えてOK)
Go