2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Go】select 文とは? - ゴルーチンの制御

Posted at

select文 - ゴルーチンの制御

Go言語は並行処理を強力にサポートしており、そのための主要なツールとしてゴルーチン(軽量スレッド)とチャネル(ゴルーチン間での通信メカニズム)があります。select文は、複数のチャネル操作(送信や受信)の中から、実行可能なものを選択するための制御構造です。

基本的な使い方

select文は、以下のような形式で使用します:

select {
case msg1 := <-ch1:
    fmt.Println("Received", msg1)
case ch2 <- 2:
    fmt.Println("Sent 2 to ch2")
case msg3, ok := <-ch3:
    if ok {
        fmt.Println("Received", msg3)
    } else {
        fmt.Println("ch3 is closed")
    }
default:
    fmt.Println("No communication")
}

上記の例で、以下のことが起こります:

  • msg1 := <-ch1: ch1からの受信を試みます。
  • ch2 <- 2: ch2への送信を試みます。
  • msg3, ok := <-ch3: ch3からの受信を試み、チャネルが閉じられている場合にはokfalseになります。
  • default: 他のcaseが実行可能でない場合に実行されます。

重要なポイント

  1. 非ブロッキング: select文は、実行可能なcaseがない場合、即座にdefaultケースを実行します。defaultがない場合、実行可能なcaseが現れるまでブロックされます。
  2. 複数のcaseが実行可能な場合: もし複数のcaseが同時に実行可能だった場合、selectはランダムにその中の1つを選択して実行します。
  3. タイムアウトの実装: select文は、特定のタイムアウトを持つ操作のために頻繁に使用されます。これは、time.After関数と組み合わせることで、操作が一定時間内に完了しない場合のタイムアウトを実装するのに便利です。

例:

select {
case msg := <-ch:
    fmt.Println("Received", msg)
case <-time.After(5 * time.Second):
    fmt.Println("Timeout")
}

この例では、chからのメッセージを待つ間に5秒経過すると、"Timeout"というメッセージが出力されます。

まとめ

select文は、ゴルーチンとチャネルを使用するGoプログラムにおいて、複数のチャネル操作の中から1つを選択するための強力なツールです。これを使うことで、非同期の通信やタイムアウトの実装が容易になります。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?