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

Mary-Kate Olsen
Freigeben: 2024-11-12 19:54:02
Original
648 Leute haben es durchsucht

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!")
}
Nach dem Login kopieren

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?
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage