「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go のタイプスイッチでフォールスルーが禁止されているのはなぜですか?

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

2024 年 11 月 17 日に公開
ブラウズ:411

Why is Fallthrough Disallowed in Go's Type Switch?

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

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

理由を理解する

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

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

説明のための例

説明するにはこの問題については、次のコードを考えてみましょう。

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
}

このアプローチにより、型の不一致や曖昧さを招くことなく、さまざまな型をより具体的に処理できるようになります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3