GoのSelectチャンネルでより柔軟な同時処理を構築する
Go言語では、select文によって複数のチャネルの操作を待ち受け、それに応じたコードブロックを実行できます。この機能によって、Go言語の並行処理はさらに柔軟性が増しています。
以下の簡単なサンプルでは、select ステートメントを使用して 2 つのチャネルの操作をリッスンする方法を示します。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch1 <- "Hello"
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- "World"
}()
select {
case msg1 := <-ch1:
fmt.Println("Received from ch1:", msg1)
case msg2 := <-ch2:
fmt.Println("Received from ch2:", msg2)
}
}
この例では、2 つのチャネル `ch1` と `ch2` を作成し、それぞれ 2 つのゴルーチンでメッセージを送信しています。 `select` ステートメントを使用してこれら 2 つのチャネルをリッスンし、メッセージが届くと対応するコードブロックが実行されます。
この例では、ch2 からのメッセージが先に届くため、最初に msg2 := <-ch2 のコードブロックが実行されて、「Received from ch2: World」が出力されます。一方、ch1 からのメッセージは後から届くため、msg1 := <-ch1 のコードブロックは実行されません。
select文により、非同期処理を柔軟に行えます。複数のチャネルの操作をリッスンし、状況に応じてそれぞれのコードブロックを実行することができます。