• ゴルーチンでは情報のやり取りに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 := <-ch
  • oktrueになればチャネルはオープンな状態で、vにはチャネルchから読み込まれた値が入っている。okfalseならチャネルはクローズされている

12.3.4 チャネルの動作

  • チャネルの状態次第でパニックを起こしてしまう。これを回避するためにsync.WaitGroupを使用する