journalの続きの記事。goroutineに引き続き、Goの並行処理を支える重要な概念であるchannelについて説明する。channelとは?channelはメモリに対するアクセスを同期するためやgoroutine間の通信(データの受け渡し)として使うものである。Go言語による並行処理では水が流れる川のように、チャネルは情報の流れの水路として機能します。渡され、そこから下流に読み込まれます。}channelを使う上で覚えておくべき基本的なものとしては以下である。書き込みがない場合は、goroutineとして実行されている無名関数がずっとブロックされ何も起こらずにプログラムが終了する。ように、バッファをつけて生成することができる。この例だと3個のバッファがあるため、4個目を書き込む時にブロックされる。送信専用channelと受信専用channelがあるchannelをcloseするchannelのブロック通常であれば、goroutineはsync.WaitGroupを使って起動元のgoroutineにjoinするようにしないと、タイミングにもよるがほぼ確実に実行されずにmain関数が終了されてしまう。Worldと出力される。これはいったいなぜだろうか?理由は、channelからデータを受信する場合データが送信されるまでブロックするからである。上のプログラムの実行順序は以下のようになる。いうようなWorker処理を簡単に実装することができる。3)のようにmakeの第2引数にバッファを指定することができる。バッファを指定することで、channelの読み込みが一度も行われなくても、キャパシティが3のバッファ付きchannelであればgoroutineは3回まで書き込みが可能になる。バッファを指定しない場合は1回書き込むとブロックされる。送信・受信専用channelchannelを宣言する時に何も指定しなければ書き込みも読み込みも可能になるが、以下のように宣言することで書き込み専用・読み込み専用のchannelを作ることができる。書き込み専用この文法は、関数の引数にchannelを受け取る場合や戻り値としてchannelを返す場合に「これは書き込みしかできない」「これは読み込みしかできない」ということを明示できるため有用である。channelのclosechannelは使い終わったらcloseすることができる。closeされたchannelからはデータを読み込むことはできない。以下のプログラムはgoroutineでchに書き込み、最後にchannelをcloseしているmainの中のforループでチャネルchからデータを読み込んでいるというものであるが、closeされているのでその段階でchannelからの読み込みはブロックされずにforループが終了する。最後に実践的なchannelの使い方を載せておく。上で紹介した以下のchannelの特徴を使っている。バッファ送信・受信専用channelcloseこのプログラムが行っていることは、URLをchannelで送って、http.Getした結果をchannelで返すというものである。errを出力している。close(results)}まとめGoの並行処理の基礎となっているchannelについて説明した。次のパートでは、応用編としてgoroutineとchannelを使った並行処理の実践的なパターンを紹介したいと思う。