読者です 読者をやめる 読者になる 読者になる

Go言語:Channesの制限

Channelsの話

  • Channelsはバッファにすることができる。
    • 容量を指定することが可能。
    • make関数の第2引数に指定。
  • caplenの実行が可能。
    • 容量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

Channelsのcloseとrange

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で記述したとおり、実行時エラーする。