ホームページ > バックエンド開発 > Golang > Go のタイプスイッチでフォールスルーが禁止されているのはなぜですか?

Go のタイプスイッチでフォールスルーが禁止されているのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-13 03:57:02
オリジナル
481 人が閲覧しました

Why is Fallthrough Disallowed in Go's Type Switch?

型スイッチのフォールスルー: 詳細な説明

Go の型スイッチにより、具体的な型に基づいて値を効率的に処理できます。ただし、標準の switch-case ステートメントとは異なり、型の切り替えではフォールスルーは明示的に禁止されています。この設計選択には、その理論的根拠について疑問が生じます。

理由を理解する

Go 仕様では、型の切り替えでは「フォールスルー」は許可されないと述べています。この禁止事項は、次のようないくつかの要因から生じています。

  • 型の不一致: 型切り替えでは、評価される変数は、入力されたケース分岐に応じて型を変更します。たとえば、変数が 1 つのブランチでブール値に割り当てられ、別のブランチで文字列が割り当てられている場合、フォールスルーにより型の不一致が発生します。
  • 混乱を招く動作: 型の切り替えでフォールスルーを許可すると、あいまいな値が発生します。セマンティクス。前の分岐で変数にブール値が割り当てられているスイッチを考えてみましょう。フォールスルーが許可されている場合、後続の分岐で変数をどのように扱うべきかは不明です。ブール値のままにするべきですか、それともブール値または新しい型の値を保持するインターフェースにするべきですか?

説明のための例

説明するためこの問題については、次のコードを検討してください:

switch i := x.(type) {
case int:
    fmt.Printf("%T\n", i) // prints "int"
case bool:
    fmt.Printf("%T\n", i) // prints "bool"
    fallthrough
case string:
    fmt.Printf("%T\n", i)
}
ログイン後にコピー

フォールスルーが許可された場合、どのようなタイプが許可されるかは不明です。文字列の場合に出力されます。ブール値のままにするべきか、ブール値と文字列の両方を含むインターフェースになるべきかは曖昧です。

代替ソリューション

フォールスルーは許可されていません。{}型スイッチの場合、同様の動作を実現する別の方法があります。

switch i := x.(type) {
case bool, string:
    if b, ok := i.(bool); ok {
        // b is a bool
    }
    // i is an interface{} that contains either a bool or a string
}
ログイン後にコピー

このアプローチでは、さまざまな型をより具体的に処理できます。型の不一致や曖昧さが生じます。

以上がGo のタイプスイッチでフォールスルーが禁止されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート