この記事では、主に Golang での switch ステートメントと select ステートメントの使い方をサンプルコードを通して詳しく紹介しています。お友達の皆さん、ぜひ編集者をフォローして一緒に学んでください。 この記事では、Golang での switch と select の使用法に関する関連コンテンツを主に紹介します。詳細な紹介を見てみましょう:
1. switch ステートメント 複数分岐の条件付き実行のメソッドを提供します。各ケースには 式 または型指定子を含めることができます。前者は case 式とも呼ばれます。したがって、Go言語のswitch文は式switch文と型switch文に分かれます。
var name string
...
switch name {
case "Golang":
fmt.Println("Golang")
case "Rust":
fmt.Println("Rust")
default:
fmt.Println("PHP是世界上最好的语言")
}
names := []string{"Golang","java","PHP"} switch name:=names[0];name { case "Golang": fmt.Println("Golang") ... default: fmt.Println("Unknown") }
Type switch ステートメントには、一般的な形式とは 2 つの違いがあります。最初のポイントは、case キーワードに続くのは式ではなく、型指定子であるということです。型指定子は複数の型リテラルで構成され、複数の型リテラルはカンマで区切られます。 2点目は、スイッチ表現が非常に特殊であるということです。この特別な式は型アサーションの役割も果たしますが、その式は v.(type)
のように非常に特殊です。ここで、v は インターフェース 型の値。このタイプの式は、type switch ステートメント内でのみ使用でき、switch 式としてのみ機能します。 type switch ステートメントの例は次のとおりです。
v := 11 switch i := interface{}(v).(type) { case int, int8, int16, int32, int64: fmt.Println("A signed integer:%d. The type is %T. \n", v, i) case uint, uint8, uint16, uint32, uint64: fmt.Println("A unsigned integer: %d. The type is %T. \n", v, i) default: fmt.Println("Unknown!") }
v.(type)
, 其中v必须代表一个接口类型的值。该类表达式只能出现在类型switch语句中,且只能充当switch表达式。一个类型switch语句的示例如下:ch1 := make (chan int, 1) ch2 := make (chan int, 1) ... select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") }
我们这里把switch表达式的结果赋给了一个变量。如此以来,我们就可以在该switch语句中使用这个结果了。这段代码被执行后,输出:"A signed integer:11. The type is int.
ここでは、switch 式の結果を変数に代入します。このようにして、この結果を switch ステートメントで使用できます。このコードを実行すると、出力は次のようになります。 "A signed integer:11. The type is int.
"
最後に、フォールスルーについて話しましょう。これはキーワードでもあり、ステートメントを表すこともできます。フォールスルー ステートメントは、式 switch ステートメント内の case ステートメントに含めることができます。その機能は、制御を次のケースに移すことです。ただし、フォールスルー ステートメントは case ステートメントの最後のステートメントとしてのみ使用できることに注意してください。さらに、それを含む case ステートメントは、それが属する switch ステートメントの最後の case ステートメントではありません。
2. Select ステートメント
Golang の select 関数は、IO 操作を監視し、IO 操作が発生したときに対応するアクションをトリガーする select、poll、および epoll に似ています。
例:
timeout := make(chan bool, 1) go func() { time.Sleep(time.Second * 10) timeout <- true }() select { case <-pssScanResponseChan: case <-timeout: fmt.PrintIn("timeout!") }
select のコード形式は switch のコード形式と非常に似ていますが、select の場合の操作ステートメントは [IO 操作] のみであることに注意してください。
この例では、select は特定の case ステートメントが完了するまで、つまり ch1 または ch2 からデータが正常に読み取られるまで待機します。 select ステートメントが終了します。
break ステートメントは、select ステートメントの case ステートメントに含めることもできます。その機能は、現在の選択ステートメントの実行を直ちに終了することです。属する case ステートメントに未実行のステートメントがあるかどうかは関係ありません。
【select を使用してタイムアウト機構を実装する】
以下のように:
ch1 := make (chan int, 1) ch2 := make (chan int, 1) select { case <-ch1: fmt.Println("ch1 pop one element") case <-ch2: fmt.Println("ch2 pop one element") default: fmt.Println("default") }
タイムアウト時間が経過すると、case2 は正常に動作します。 したがって、select ステートメントは 終了 します。 常に ch の読み取り操作をブロックするのではなく、 chリード動作のタイムアウト設定を実装します。
次はもう少し興味深いものです。
select文にdefault:
ch := make (chan int, 1) ch <- 1 select { case ch <- 2: default: fmt.Println("channel is full !") }
が含まれている場合 このとき、ch1とch2が両方とも空であるため、case1もcase2も正常に読み込まれません。 次に、select はデフォルトのステートメントを実行します。
このデフォルトの機能により、select ステートメントを使用して chan がいっぱいかどうかを検出できます。
は次のとおりです:
flag := false for { select { case <-pssScanResponseChan: continue default: flag = true } if true == flag { break } }
1を挿入するときにchがすでにいっぱいであるため、chが2を挿入しようとしているときにchがいっぱいであることがわかり(case1がブロックされている)、その後selectはdefaultステートメントを実行します。 このようにして、常に待機するのではなく、チャネルがいっぱいかどうかを検出することができます。
たとえば、サービスがある場合、リクエストが到着すると、ジョブを生成してチャネルにスローし、他のコルーチンがチャネルからジョブを取得して実行します。 ただし、チャンネルが非表示になった場合は、ジョブを放棄して [サービスが混雑しています。後でもう一度お試しください。 ] この要件を達成するには、select を使用できます。
此外,利用default特性,我们可以使用select语句将chan清空,如下:
flag := false for { select { case <-pssScanResponseChan: continue default: flag = true } if true == flag { break } }
以上がGolangのswitch文とselect文の使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。