GoのSelectチャンネルを深く理解し実践する
Go言語では、select文やチャネルを使用して並行プログラミングを行います。
チャンネルは、安全なデータの受け渡しを行う、ゴルーチン間の通信チャネルです。送信は <- 演算子を使用して行い、受信は <- 演算子を使用して行います。
Select文は複数のチャネルの同時操作を扱う文です。switch文に似ていますが、通信操作に使用します。Select文は、準備ができたチャネルの1つを待った後、それに対応した操作を実行します。複数のチャネルが同時に準備できている場合には、ランダムに1つを選択して実行します。準備できているチャネルが1つもなければ、いずれかのチャネルが準備できるまで待ちます。
以下に、`select` ステートメントおよびチャネルを使用するサンプルコードを 示します。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(time.Second * 2)
ch1 <- "Hello"
}()
go func() {
time.Sleep(time.Second * 1)
ch2 <- "World"
}()
for i := 0; i < 2; i++ {
select {
case msg1 := <-ch1:
fmt.Println("Received:", msg1)
case msg2 := <-ch2:
fmt.Println("Received:", msg2)
}
}
}
コード上で、チャネルch1とch2を作成し、2つのGoルーチンでそれぞれデータを送信。そしてメインのルーチンでselect文を用いて、この2つのチャネルのいずれかにデータが受信されるのを待機。select文ではch1、ch2の受信可能状態のどちらかが満たされるまで待機し、それぞれの処理を行う。今回、ch2のデータが先に受信可能になったため、その処理が実行され”Received: World”が出力された。
select文とチャネルを使用することで、並行プログラミングを容易に実装できます。実用的なアプリケーションでは、select文を使用して複数のネットワークリクエストや複数の並行タスクを処理するなどのシナリオを使用できます。