select は Go 言語で一般的に使用されるキーワードです。チャネルに関連する IO 操作を監視するために使用されます。IO 操作が発生すると、対応するアクションがトリガーされます。
実行できるケースが複数ある場合、Select は実行するケースをランダムかつ公平に選択します。その他は実行されません。 (推奨学習: go)
それ以外の場合:
default 句がある場合、ステートメントが実行されます。
default 句がないと、select は通信が実行できるようになるまでブロックされ、Go はチャネルまたは値を再評価しません。
基本的な使用法
//select基本用法 select { case <- chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2 <- 1: // 如果成功向chan2写入数据,则进行该case处理语句 default: // 如果上面都没有成功,则进入default处理流程
1 つ以上の IO 操作を完了できる場合、Go ランタイム システムは実行する 1 つをランダムに選択します。そうでない場合は、デフォルトのブランチの場合、デフォルトのブランチ ステートメントが実行されます。デフォルトがない場合、select ステートメントは、少なくとも 1 つの IO 操作が実行できるまでブロックされます。
start := time.Now() c := make(chan interface{}) ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(4*time.Second) close(c) }() go func() { time.Sleep(3*time.Second) ch1 <- 3 }() go func() { time.Sleep(3*time.Second) ch2 <- 5 }() fmt.Println("Blocking on read...") select { case <- c: fmt.Printf("Unblocked %v later.\n", time.Since(start)) case <- ch1: fmt.Printf("ch1 case...") case <- ch2: fmt.Printf("ch1 case...") default: fmt.Printf("default go...") }
上記のコードを実行します。時間はまだ3秒未満です。したがって、現在のプログラムがデフォルトで実行されます。
以上がgolang selectはブロックしないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。