Go のタイプスイッチでフォールスルーが許可されないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-12 19:54:02
オリジナル
703 人が閲覧しました

Why is Fallthrough Not Allowed in Go's Type Switch?

型切り替えのフォールスルー: なぜ許可されないのですか?

質問:

Go でフォールスルー ステートメントを使用しようとしていますタイプスイッチでエラーが発生します。このコンテキストではフォールスルーが許可されないのはなぜですか?

答え:

型スイッチでは、オンに切り替えられる変数は、実行される特定のケースに応じて型を変更します。たとえば、次のコードの変数 i は、呼び出されるケースに応じて型が異なります:

var x interface{}
switch i := x.(type) {
    case int:
        fmt.Println(i + 1)
    case float64:
        fmt.Println(i + 2.0)
    case bool:
        fallthrough
    case string:
        fmt.Printf("%v", i)
    default:
        fmt.Println("Unknown type. Sorry!")
}
ログイン後にコピー

フォールスルーが許可された場合、どのように動作すると予想されますか? bool の場合、i は bool として入力されます。ただし、文字列の場合、i は文字列として入力されます。

フォールスルーを許可するには、魔法の型モーフィング (不可能) または変数シャドウイング (意味のある値なし) のいずれかが必要です。次の例を考えてみましょう:

switch i := x.(type) {
    case int:
        // i is an int
        fmt.Printf("%T\n", i); // prints "int"
    case bool:
        // i is a bool
        fmt.Printf("%T\n", i); // prints "bool"
        fallthrough
    case string:
        fmt.Printf("%T\n", i);
        // What is the type here? Should be "string", but what if it falls through from bool?
}
ログイン後にコピー

唯一可能な解決策は、フォールスルーで後続のケースを暗黙的にインターフェイスにキャストすることです。しかし、これは混乱を招き、定義が不十分になります。

switch-case 式に必要な型チェック動作が不可欠な場合は、既存の機能を使用して実装できます。

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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート