次のコラムでは、Golang チュートリアル コラムから、golang での select の理解を紹介します。
Select ステートメントの構文は Switch ステートメントとよく似ていますが、Select の Case は通信操作 (チャネル操作) である必要があります。実行ロジックは次のとおりです。 Case の背後にあるどのチャネル操作が正常に実行できるか。その後、Case の下のコード ブロックが実行されます。複数の Case を同時に正常に実行できる場合、そのうちの 1 つがランダムに選択されます。どの Case も正常に実行できない場合は、デフォルトのコード ブロックが実行されます。デフォルトがない場合はブロックされ、デッドロック エラーが返されます。
IO 操作を監視します。IO 操作が発生すると、対応するアクションをトリガーします。
このステートメントは正しいです。(チャネルの) IO 操作を監視し、対応するアクションを実行することは確かに選択です。アプリケーション シナリオ、ただし、Select ステートメントが Channel 操作を実行するケースを選択していると誤解しないでください。この理解は間違っています! Select が実際に選択するのは、どのケースでチャネル操作が正常に実行できるかであり、そのケースのコード ブロックが実行されます。
たとえば、チャネル c1 にデータを書き込む場合
c1 := make(chan string, 1)c1 <- "Hello World!"
次のような Select 判定文があるとします
select { case <-c1: fmt.Println("Case 1 is selected") case c1<-"Hello World!": fmt.Println("Case 2 is selected") default : fmt.Println("Default is selected")}
以下の結果が得られます
Case 1 is selected
c1 にはデータが書き込まれているため、「c1 からデータを読み取る」ことができます。つまり、最初のケースは正常に実行できます。したがって、最終的には最初のケースのコード ブロックが実行されます。
以上がgolangにおけるselectの理解についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。