Golangのswitch文とselect文の使い方を詳しく解説

零下一度
リリース: 2017-06-29 15:30:28
オリジナル
1887 人が閲覧しました

この記事では、主に Golang での switch ステートメントと select ステートメントの使い方をサンプルコードを通して詳しく紹介しています。お友達の皆さん、ぜひ編集者をフォローして一緒に学んでください。 この記事では、Golang での switch と select の使用法に関する関連コンテンツを主に紹介します。詳細な紹介を見てみましょう:

1. switch ステートメント 複数分岐の条件付き実行のメソッドを提供します。各ケースには または型指定子を含めることができます。前者は case 式とも呼ばれます。したがって、Go言語のswitch文は式switch文と型switch文に分かれます。

1. 式 switch ステートメント

var name string 
... 
switch name { 
case "Golang": 
 fmt.Println("Golang") 
case "Rust": 
 fmt.Println("Rust") 
default: 
 fmt.Println("PHP是世界上最好的语言") 
}
ログイン後にコピー
Go は、式が switch 式と一致していることが判明する限り、各 case ステートメントの case 式を上から下に順番に評価します。が同じ場合、case ステートメントが選択されます。残りの case ステートメントは無視されます。 if と同様に、switch ステートメントにも初期化ワードを含めることができ、その外観と書き方はまったく同じです:


names := []string{"Golang","java","PHP"} 
switch name:=names[0];name { 
case "Golang": 
 fmt.Println("Golang") 
... 
default: 
 fmt.Println("Unknown") 
}
ログイン後にコピー

2. Type switch ステートメント


Type switch ステートメントには、一般的な形式とは 2 つの違いがあります。最初のポイントは、case キーワードに続くのは式ではなく、型指定子であるということです。型指定子は複数の型リテラルで構成され、複数の型リテラルはカンマで区切られます。 2点目は、スイッチ表現が非常に特殊であるということです。この特別な式は型アサーションの役割も果たしますが、その式は v.(type) のように非常に特殊です。ここで、v は インターフェース 型の値。このタイプの式は、type switch ステートメント内でのみ使用でき、switch 式としてのみ機能します。 type switch ステートメントの例は次のとおりです。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!