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