Go言語のセレクトチャネルを深く理解する:Go言語の並行プログラミング
Go言語では、チャネルの選択を行うselect文によって、並行処理が実現できます。select文は複数のチャネルを監視し、操作可能なチャネルが1つ以上ある場合に、対応するコードブロックを実行します。
SELECT文の基本文法は次のとおりです。
select {
case <- channel1:
// 执行 channel1 的操作
case <- channel2:
// 执行 channel2 的操作
default:
// 如果没有任何通道操作可用,则执行默认操作
}
SELECT文は、いずれかのチャンネル操作が使用可能になるまでブロックされます。複数のチャンネル操作が使用可能な場合、Go言語は実行する操作をランダムに選択します。
SELECT文は、SWITCH構成と組み合わせて、より複雑なロジック制御を実現できます。
以下は、select 文を使用して複数のチャネルで選択するサンプルコードです。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch1 <- "channel 1"
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- "channel 2"
}()
select {
case msg1 := <-ch1:
fmt.Println("Received from channel 1:", msg1)
case msg2 := <-ch2:
fmt.Println("Received from channel 2:", msg2)
default:
fmt.Println("No channel operation available")
}
}
上の例では、Ch1とCh2という2つのチャンネルを作成し、それらに2つの匿名関数をそれぞれ用いてメッセージを送信します。select文を使って2つのチャンネルを操作可能になるまで待機し、どちらかのチャンネルが操作可能な場合には、それに応じたコードブロックを実行します。
出力結果は、次のようになる可能性があります。
Received from channel 2: channel 2
何のチャンネル操作も利用できなくなったら、select文はdefaultコードブロックを実行します。
「select」文を使うことで、複数のチャネル間での並行処理を容易に実現でき、チャネルに応じた処理を記述できる。これはGo言語の並行プログラミングにおける重要な特徴の一つである。