- ゴルーチンでは情報のやり取りに
channelを使用する - チャネル生成は
ch := make(chan 任意の型)で行う- チャネルは参照型
- ゼロ値は
nil
12.3.1 読み込み、書き込み、バッファリング
- チャネルとやり取りするには
<-オペレータを使用する- チャネルからの読み込みはチャネル変数の左側に
<-を書く
- チャネルからの読み込みはチャネル変数の左側に
a: = <- ch- チャネルへの書き込みはチャネル変数の右側に
<-を書く
ch <- b- チャネルに書き込まれた値は一度だけ読み込むことができる
- 読み込み、書き込みのチャネルは分けるのが一般的
- 読み込みの指定方法
ch <- chan int
- 書き込みの指定方法
ch chan<- int
- 読み込みの指定方法
- デフォルトでチャネルはバッファリングされず、ほとんどの場合、バッファ付きのチャネルを使う必要はない
- バッファリングされるチャネル生成は
ch := make(chan 任意の型, 10)のように、第二引数にキャパシティを指定する
- バッファリングされるチャネル生成は
12.3.2 for-rangeとチャネル
- 他の
for-rangeループとは異なり、チャネルに関しては宣言される変数は一つしかなく、それに値が代入される - チャネルから読み込めない場合は、読み込めるようになるかチャネルがクローズされるまで、ポーズされることになる
for-rangeループが終了するのは下記のいずれかの場合- チャネルがクローズされた時
break文あるはreturn文が実行された時
for v := range ch {
fmt.Println(v)
}12.3.3 チャネルのクローズ
これ以上書き込む必要がなくなったら組み込みのclose関数を使ってチャネルをクローズする
close(ch)- クローズ後のチャネルへの書き込みや再クローズはパニックになる
- クローズ後のチャネルからの読み込みは許可されている
- バッファリングされていて、まだ読み込まれていない値がある場合は順番に読み込まれる。全て読み込まれている場合は
nilが返る - バッファリングされていない場合、チャネルの要素型のゼロ値が返る
- バッファリングされていて、まだ読み込まれていない値がある場合は順番に読み込まれる。全て読み込まれている場合は
- 「チャネルに書き込まれて戻されたゼロ値」と「チャネルがクローズされていたために戻されたゼロ値を区別する必要が生じる。これは、カンマ ok イディオムを使って検知できる
v, ok := <-chokがtrueになればチャネルはオープンな状態で、vにはチャネルchから読み込まれた値が入っている。okがfalseならチャネルはクローズされている
12.3.4 チャネルの動作
- チャネルの状態次第でパニックを起こしてしまう。これを回避するために
sync.WaitGroupを使用する