Goのチャネル(channel)は、複数のGoroutine間でデータをやり取りするための仕組みです。Goの並行処理において、チャネルは「Goroutine間の通信手段」として非常に重要な役割を果たします。ここでは、チャネルの基本的な使い方と関連概念について詳しく説明します。
1. チャネルの概要
チャネルは、**送信(send)と受信(receive)**という2つの操作によってデータのやり取りを行います。
-
チャネルは
chanキーワードを使って作成します。 -
同じ型のデータしか送受信できません。
-
チャネルの送受信はデフォルトではブロッキング動作です(片方が準備できるまで待機)。
2. チャネルの宣言と作成
3. チャネルへの送信と受信
このとき、送信側と受信側のどちらか一方が準備できていないと、もう一方は待機します。
4. Goroutineと組み合わせた基本例
この例では、worker関数が別のGoroutineとして実行され、チャネルを通じてメッセージを送信しています。
5. バッファ付きチャネル
バッファ付きチャネルを使うと、一定数の値をチャネルに非同期に送信できます。
6. チャネルのクローズ
チャネルを閉じると、それ以降送信はできなくなり、受信側ではrange文や多値受信で検知できます。
7. select文を使った複数チャネルの監視
select文を使った複数チャネルの監視select文を使うと、複数のチャネルからのデータを待つことができます。
8. チャネルの注意点
-
クローズされたチャネルに対して送信しようとするとランタイムパニックになります。
-
読み取りはクローズ後でも可能で、値はそのまま読み取れますが、
falseのフラグが返されます。
まとめ
| 概要 | 内容 |
|---|---|
| チャネル作成 | make(chan 型) |
| 送信 | ch <- 値 |
| 受信 | 値 := <-ch |
| バッファ付き | make(chan 型, バッファサイズ) |
| クローズ | close(ch) |
| 複数監視 | select文 |
チャネルはGoの並行処理において、Goroutine間の安全で効率的な通信手段を提供します。正しく使うことで、ロックを使わずにスレッドセーフな設計を実現できます。
生成日:2025/05/03