ホームページ  >  記事  >  バックエンド開発  >  Go の型スイッチではフォールスルーが許可されないのはなぜですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 11:41:01646ブラウズ

Why is fallthrough not allowed in Go's type switches?

型スイッチと通常の 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 であることが想定されているため、これにより型の一貫性が失われます。一貫性を維持するため、型の切り替えではフォールスルーは許可されません。

条件付き型処理の代替アプローチ:

条件付きで複数の型を処理する必要がある場合は、次の方法があります。タイプ スイッチの代替アプローチは次のとおりです:

  • 複数の通常のスイッチを使用するステートメント: 処理する必要がある型ごとに個別の switch ステートメントを作成します。
  • 空のインターフェイス タイプ アサーションを使用します。 .(interface{}) タイプ アサーションを使用して型を確認します。インターフェイス値の値を取得し、それに応じて値を処理します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。