【実務向け】Go selectの使い方|並行処理を制御する応用テクニック

プログラム

Go言語の並行処理では、goroutinechannelが中心になります。
その中で複数の処理を制御する重要機能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=並行処理の制御装置」

コメント

タイトルとURLをコピーしました