型スイッチと通常の switch ステートメント
Go では、通常の switch ステートメントではフォールスルーが許可されますが、型スイッチでは許可されません。 Go の仕様ではこの矛盾の理由が明示的に説明されていませんが、これは 2 つの構造の根本的な違いに起因しています。
通常の Switch ステートメント:
switch ステートメントでは、switch 式は特定の型の単一の定数値として評価されます。次に、この値は case ステートメントの定数と比較されます。 switch 式が定数と一致する場合、対応する case ブロックが実行されます。
通常の switch ステートメントのフォールスルーにより、switch 式が case 定数と一致するかどうかに関係なく、次の case ブロックに実行を継続できます。この動作は、連続する case ステートメントが関連するシナリオを処理する場合に役立ちます。
タイプ スイッチ:
タイプ スイッチは、スイッチ式をインターフェイス値に評価します。 。インターフェイス値の型は実行時に動的に決定され、case ステートメントで指定された型と比較されます。一致に応じて、対応する case ブロックが実行されます。
通常の switch ステートメントとは異なり、フォールスルーは一貫して適用できないため、型スイッチでは許可されません。その理由は、型スイッチのスイッチ式は任意の型のインターフェイス値を返すことができるためです。フォールスルーが許可されている場合、スイッチ式の型は、ある case ブロックから次の case ブロックに移行するときに変化します。
たとえば、次の型スイッチを考えてみましょう。
switch i := x.(type) { case int: fmt.Println(i + 1) fallthrough // Error: cannot fallthrough in type switch case float64: fmt.Println(i + 2.0) }
この例では、コードでは、switch 式 x が整数の場合、case int ブロックが実行されます。フォールスルーが許可された場合、実行は case float64 ブロックまで続行されます。ただし、この時点で、switch 式 i の型は int から float64 に変わります。
後続の case ステートメントでは switch 式が float64 であることが想定されているため、これにより型の一貫性が失われます。一貫性を維持するため、型の切り替えではフォールスルーは許可されません。
条件付き型処理の代替アプローチ:
条件付きで複数の型を処理する必要がある場合は、次の方法があります。タイプ スイッチの代替アプローチは次のとおりです:
以上がGo の型スイッチではフォールスルーが許可されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。