33

golangのtypeswitchステートメントでフォールスルーが許可されないのはなぜか疑問に思います。

仕様によると、「タイプスイッチでは「フォールスルー」ステートメントは許可されていません。」これは、許可されない理由についてはあまり説明されていません。

添付されているコードは、typeswitchステートメントのフォールスルーが役立つ可能性があるシナリオをシミュレートするためのものです。

知らせ!このコードは機能せず、「タイプスイッチでフォールスルーできません」というエラーが発生します。タイプスイッチでフォールスルーステートメントを許可しない理由として考えられるものは何でしょうか。

//A type switch question
package main

import "fmt"

//Why isn't fallthrough in type switch allowed?
func main() {
    //Empty interface
    var x interface{}

    x = //A int, float64, bool or string value

    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!")
    }
}
4

1 に答える 1

45

どのようfallthroughに働くと思いますか?このタイプスイッチでは、i変数は呼び出された特定のケースに依存するタイプを持っています。したがってcase booli変数にはとして入力されboolます。しかし、case stringそれはとして入力されstringます。つまり、iその型を魔法のように変形することを要求しているのですが、それは不可能です。または、新しい変数によってシャドウされるように要求しているのです。新しい変数は、値が実際にはそうではないi stringため、値がありません。 xstring


問題を説明するための例を次に示します。

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 does that type? It should type "string", but if
    // the type was bool and we hit the fallthrough, what would it do then?
}

考えられる唯一の解決策は、fallthrough原因を後続のcase式をiとして残すinterface{}ことですが、それは紛らわしく、悪い定義になります。

この動作が本当に必要な場合は、既存の機能を使用してこれをすでに実行できます。

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
}
于 2012-07-17T21:45:36.627 に答える