ホームページ  >  記事  >  バックエンド開発  >  golangにおけるselectの理解について

golangにおけるselectの理解について

藏色散人
藏色散人転載
2020-08-26 11:46:452748ブラウズ

次のコラムでは、Golang チュートリアル コラムから、golang での select の理解を紹介します。

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 サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。