Go言語の並行処理では、goroutineとchannelが中心になります。
その中で複数の処理を制御する重要機能が select です。
本記事では、Goのselectについて「使い方・実行タイミング・応用」を実務視点で解説します。
selectとは?
selectは、複数のchannelの送受信を同時に待ち、準備できた処理を実行する構文です。
基本構文
select {
case msg := <-ch1:
fmt.Println(msg)
case msg := <-ch2:
fmt.Println(msg)
}
👉 最初に受信できたcaseが実行される
実務での使い方①:複数処理の待機
select {
case res := <-api1:
fmt.Println("API1:", res)
case res := <-api2:
fmt.Println("API2:", res)
}
👉 複数の非同期処理を同時に扱える
実務での使い方②:タイムアウト処理
select {
case res := <-ch:
fmt.Println(res)
case <-time.After(2 * time.Second):
fmt.Println("タイムアウト")
}
👉 API通信・外部処理で必須
実務での使い方③:default(非ブロック)
select {
case msg := <-ch:
fmt.Println(msg)
default:
fmt.Println("データなし")
}
👉 処理を止めない設計ができる
応用:無限ループ+select
for {
select {
case msg := <-ch:
fmt.Println(msg)
}
}
👉 常駐処理(サーバー・監視)で使用
よくあるミス
❌ デッドロック
❌ channel未初期化
❌ select使いすぎ
ベストプラクティス
- timeoutは必ず入れる
- defaultは慎重に使う
- channel設計が最重要
💡 結論
👉
「select=並行処理の制御装置」


コメント