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フィードバックを取得できます。ローカル設定は不要です。