Go: selectブロック

  • 複数のチャネル操作を待ち受け、準備ができたものを1つ実行する構文
    • switch のチャネル版のイメージ
  • 挙動
    • 実行可能な case が1つだけ → それを実行
    • 複数ある → ランダムに1つ選ばれる(偏りを防ぐため)
    • 1つもない → default があればそれを実行、なければブロックして待つ
select {
case v := <-ch1:
    // ch1 から受信できたとき
    fmt.Println(v)
case ch2 <- x:
    // ch2 へ送信できたとき
case <-time.After(time.Second):
    // 1秒間どのcaseも準備できなかったとき(タイムアウト)
default:
    // どのcaseもすぐ実行できないとき(非ブロッキング)
}