channel
Go 言語で goroutine 間のデータ通信と同期を行う型付きパイプ
channel とは
channel は Go 言語の組み込み型で、goroutine 間でデータを安全に送受信する型付きパイプである。共有メモリではなく、メッセージパッシングで goroutine 間の通信を行う。Go の並行処理の哲学「メモリを共有して通信するな、通信してメモリを共有せよ」を体現する。
基本的な使い方
基本的な使い方のコード例を示す。
// チャネルの作成
ch := make(chan string)
// goroutine で送信
go func() {
ch <- "Hello" // 送信 (受信されるまでブロック)
}()
// メインで受信
msg := <-ch // 受信 (送信されるまでブロック)
fmt.Println(msg) // "Hello"
バッファなし vs バッファ付き
バッファなしと バッファ付き のコード例を比較する。
// バッファなし (同期): 送信と受信が同時に行われる
ch := make(chan int)
// 送信側は受信側が準備できるまでブロック
// バッファ付き (非同期): バッファが満杯になるまで送信がブロックしない
ch := make(chan int, 10)
// 10 個までバッファに溜められる
| 種類 | 動作 | 用途 |
|---|---|---|
| バッファなし | 送受信が同期 | goroutine 間の同期ポイント |
| バッファ付き | バッファが満杯になるまで非同期 | プロデューサー/コンシューマー |
select 文
複数のチャネルを同時に待ち受ける。最初に準備できたチャネルの操作を実行する。
select {
case msg := <-msgCh:
fmt.Println("Message:", msg)
case err := <-errCh:
fmt.Println("Error:", err)
case <-time.After(5 * time.Second):
fmt.Println("Timeout")
}
select は Go の並行処理で最も強力な構文だ。タイムアウト、キャンセル、複数ソースからの受信を簡潔に記述できる。
チャネルの方向
チャネルの方向のコード例を示す。
func producer(out chan<- int) { out <- 42 } // 送信専用
func consumer(in <-chan int) { v := <-in } // 受信専用
チャネルの方向を制限することで、誤った操作をコンパイル時に防ぐ。
チャネルのクローズ
チャネルのクローズのコード例を示す。
close(ch) // チャネルを閉じる (これ以上送信しない)
// range でチャネルが閉じるまで受信
for msg := range ch {
fmt.Println(msg)
}
TypeScript の類似概念
TypeScript には channel がないが、AsyncGenerator や ReadableStream が類似の概念を提供する。
Go の並行処理パターン比較
Go の並行処理パターン比較を以下にまとめる。
| パターン | 説明 | 用途 |
|---|---|---|
| チャネル | ゴルーチン間のメッセージパッシング | データの受け渡し |
| sync.Mutex | 排他制御 | 共有メモリの保護 |
| sync.WaitGroup | ゴルーチンの完了待ち | 並列処理の同期 |
| select | 複数チャネルの待ち受け | タイムアウト、多重化 |
| context | キャンセル、タイムアウト | リクエストのライフサイクル |
さらに掘り下げるなら関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
Go
Google が開発したシンプルで高速なコンパイル言語で、goroutine による軽量な並行処理が特徴
並行処理 (Concurrency) とは - 並列処理 (Parallelism) との違い
Concurrency (並行処理) の意味を解説。複数のタスクを論理的に同時進行させる手法で、物理的に同時実行する並列処理 (Parallelism) とは区別される。Node.js / Go / Rust の並行処理モデルの違いも紹介。
goroutine
Go の軽量スレッドで、数十万規模の並行処理を低コストで実現する
メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤
ファンアウト
1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターン
Pub/Sub
発行者と購読者が直接通信せず、メッセージブローカーを介して非同期にメッセージを交換するパターン
関連する記事
有名プログラマの読書習慣 - 天才たちは何を読んできたのか
リーナス・トーバルズ、まつもとゆきひろ、ビル・ゲイツなど、著名なプログラマたちの読書習慣と愛読書を紹介します。天才たちの読書スタイルから学べることとは。
深夜 3 時のデプロイ前に読み返したい 1 ページ
本番デプロイの直前、最終確認のチェックリストとして技術書の特定のページが役立つことがあります。緊張の場面で頼りになる「お守りの 1 ページ」の見つけ方と活用法。
設計 / アーキテクチャ本ガイド - 設計力を上げる技術書の選び方
ソフトウェア設計を学べる技術書をコード / モジュール / システムの 3 レイヤーに分類し、レベルに応じた読む順番の指針を紹介します。