0Pricing
Go Academy · レッスン

select文

selectによるチャネルの多重化

「select文」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

selectとは何か

select 文を使用すると、ゴルーチンは複数のチャネル操作を同時に待機できます。switch に似ていますが、チャネル用に、実行可能になった最初のケースを選択します。

基本構文

select の各 case は、チャネルへの送信またはチャネルからの受信です:

select {
case msg := <-ch1:
    fmt.Println("ch1:", msg)
case msg := <-ch2:
    fmt.Println("ch2:", msg)
}

defaultによるノンブロッキング処理

default ケースを追加すると select はノンブロッキングになります。どのチャネルも準備できていない場合、すぐに default へ進みます。

select {
case v := <-ch:
    fmt.Println(v)
default:
    fmt.Println("no value ready")
}

ランダム選択

複数のケースが同時に準備できている場合、Go はその中から1つをランダムに選びます。準備できている各ケースの選択確率は等しくなります。これにより、特定のケースが永久に選ばれない状態を防ぎます。

selectでの送信

ケースではチャネルへの送信も指定できます。送信ケースは、チャネルにバッファの空きがある場合(または受信側が待機している場合)に準備できます。

select {
case ch1 <- val1:
    fmt.Println("sent to ch1")
case ch2 <- val2:
    fmt.Println("sent to ch2")
}

空のselectは永久にブロックする

ケースのない単独の select{} は、現在のゴルーチンを永久にブロックします。これは、他のゴルーチンの実行中にメインゴルーチンを終了させないためによく使われるイディオムです。

func main() {
    go serve()
    select {} // block forever
}

selectによるループ

select を for ループ内に配置すると、チャネルを継続的に多重化できます。done チャネルを追加すると、ループを正常に終了できます。

for {
    select {
    case v := <-data:
        process(v)
    case <-done:
        return
    }
}

nilチャネル

nil チャネルは select のケースで永久にブロックするため、そのケースを実質的に無効にします。これを利用して、実行時にケースを動的に有効化または無効化できます。

var ch chan int // nil
select {
case v := <-ch: // never selected
    _ = v
case v := <-other:
    fmt.Println(v)
}

閉じたチャネルを使うselect

閉じたチャネルからの受信は常に即座に成功し、ゼロ値を返します。チャネルが閉じたことを検出するには、2値形式を使用します。

select {
case v, ok := <-ch:
    if !ok { return } // channel closed
    use(v)
}

優先順位付けのパターン

Go の select は、標準では優先順位をサポートしていません。特定のチャネルを優先するには、select を入れ子にするか、default を使って優先度の高いチャネルを先に確認するループを使用します。

for {
    select {
    case v := <-highPriority:
        handle(v)
    default:
        select {
        case v := <-lowPriority:
            handle(v)
        }
    }
}

ここまでの復習

select は複数のチャネルを待機し、準備できたケースをランダムに選択します。default を使うとノンブロッキングになり、nil チャネルはケースを無効にします。よく使われるパターンは for+select+done です。

確認問題

select の複数のケースが同時に準備できている場合、どうなりますか?

復習: select文

重要なポイント:

  • select は、いずれかのチャネルケースが準備できるまでブロックします
  • 複数のケースが準備できている場合は、ランダムに選択されます
  • default を指定するとノンブロッキングになります
  • nil チャネルはそのケースを無効にします
  • for+select+done は標準的な多重化ループです

よくある質問

「select文」レッスンは無料ですか?

はい。「select文」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「select文」で何を学びますか?

selectによるチャネルの多重化 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「select文」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. select文
  2. タイムアウトとTicker
  3. ファンインとファンアウトのパターン
  4. ワーカープールパターン
← Go Academyに戻る