Golangのswitch文とselect文の使い方を詳しく解説
この記事では、主に 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Go 言語で事前定義されたタイムゾーンを使用するには、次の手順が必要です。 「time」パッケージをインポートします。 LoadLocation 関数を使用して特定のタイム ゾーンを読み込みます。読み込まれたタイムゾーンは、Time オブジェクトの作成、時刻文字列の解析、日付と時刻の変換の実行などの操作で使用します。事前定義されたタイム ゾーン機能の適用を説明するために、異なるタイム ゾーンを使用して日付を比較します。

Cスイッチステートメントでデフォルトに起因するエラーを回避するための戦略:定数の代わりに列挙を使用し、ケースステートメントの値を列挙の有効なメンバーに制限します。最後のケースステートメントでフォールスルーを使用して、プログラムが以下のコードを引き続き実行できるようにします。フォールスルーなしのスイッチステートメントの場合、エラー処理のためのデフォルトステートメントを常に追加するか、デフォルトの動作を提供します。

C言語でのデフォルトのベストプラクティス:比類のない値のデフォルト処理として、スイッチステートメントの最後に配置します。プログラムの堅牢性を改善するために、未知の値または無効な値を処理するために使用されます。簡潔さを維持するために、ケースブランチとの複製を避けてください。読みやすさを改善するためのデフォルトのブランチの目的について明確にコメントします。明確さを維持するために、あるケースで複数のデフォルトを使用しないでください。デフォルトのブランチを簡潔に保ち、複雑な操作を避けます。列挙値をケース条件として使用して、保守性を向上させることを検討してください。大規模なスイッチステートメントでは、複数のデフォルトブランチを使用してさまざまな状況を処理します。

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。
