Go言語:Channesの制限
Channelsの話
- Channelsはバッファにすることができる。
- 容量を指定することが可能。
make
関数の第2引数に指定。
cap
とlen
の実行が可能。- 容量
cap
以上にはバッファ(値の送信)できない。ブロックする。 - バッファサイズ
len
以上には取り出し(値の受信)できない。
- 容量
- 送信する値がなくなったら、Channelsを閉じることができる。
- 受信側で閉じない。
- 閉じることは必須ではない。
- Channelsの受け取り側で、閉じられているかどうかがわかる。
- 受信のチャネルオペレータの2番目のパラメータ(boolean)がcloseかどうかがわかる。
- 閉じられている場合、バッファサイズ以上の取り出し(値の受信)が可能。
- 受信される値は型のデフォルト値(だと思う)。intなら0。
range
で受信すると、閉じられるまで繰り返される。range
を使う場合は、必ず閉じなければいけない。- 実行時エラーになる。
書いてみた1
出力
before send 0 2 after send 2 2 received value 1 2 after receive 0 2
コメントアウトを解いてみると、fatal error
が発生する。
- 容量以上に送信しようとした時。
- バッファサイズ以上に受信しようとした時。
- コンパイル時にエラーにはならないため、実行時エラーとなる。
- エラーの内容から、送信か受信かがわかる。
all goroutines are asleep - deadlock! goroutine N [chan send]:
fatal error: all goroutines are asleep - deadlock! goroutine N [chan receive]:
書いてみた2
range
0 1 1 2 3 5 8 13 21 34
rangeじゃない
0 true 1 true 1 true 2 true 3 true 5 true 8 true 13 true 21 true 34 true 0 false
rangeでcloseしなかった場合。
- 実行時エラーで以下のようなエラーが出る。
- エラーするのは、
range
の行。
fatal error: all goroutines are asleep - deadlock! goroutine N [chan receive]:
rangeを使わない受信でcloseしなかった場合。
- 書いてみた1で記述したとおり、実行時エラーする。