Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist Fallthrough im Typwechsel von Go nicht zulässig?

Warum ist Fallthrough im Typwechsel von Go nicht zulässig?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 19:54:02699Durchsuche

Why is Fallthrough Not Allowed in Go's Type Switch?

Fallthrough in Type Switch: Warum nicht zulässig?

Frage:

In Go wird versucht, die Fallthrough-Anweisung zu verwenden in einem Typwechsel löst einen Fehler aus. Warum ist Fallthrough in diesem Zusammenhang nicht zulässig?

Antwort:

Bei einem Typwechsel ändert die eingeschaltete Variable ihren Typ abhängig vom spezifischen Fall, der ausgeführt wird. Beispielsweise hat die Variable i im folgenden Code einen Typ, der von der aufgerufenen Groß-/Kleinschreibung abhängt:

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

Wenn Fallthrough zulässig wäre, wie würde es sich dann voraussichtlich verhalten? Im Fall von bool wird i als bool eingegeben. Im Fall einer Zeichenfolge wird i jedoch als Zeichenfolge eingegeben.

Das Zulassen von Fallthrough würde entweder eine magische Typveränderung (unmöglich) oder eine variable Beschattung (ohne sinnvollen Wert) erfordern. Betrachten Sie das folgende Beispiel:

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?
}

Die einzig mögliche Lösung wäre, dass Fallthrough nachfolgende Fälle implizit in interface{} umwandelt, aber das wäre verwirrend und schlecht definiert.

Wenn das gewünschte Typprüfungsverhalten für Switch-Case-Ausdrücke wesentlich ist, kann es mit vorhandener Funktionalität implementiert werden:

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
}

Das obige ist der detaillierte Inhalt vonWarum ist Fallthrough im Typwechsel von Go nicht zulässig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn