Heim >Backend-Entwicklung >Golang >Warum ist Fallthrough bei Go-Typwechseln verboten?

Warum ist Fallthrough bei Go-Typwechseln verboten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-16 00:35:02227Durchsuche

Why is Fallthrough Prohibited in Go's Type Switches?

Fallthrough-Verbot bei Typwechseln:

In Go ist die „Fallthrough“-Anweisung ein Sprachkonstrukt, das die Ausführung nachfolgender Fälle in ermöglicht eine Switch-Anweisung ohne explizite Break-Anweisung. Fallthrough ist jedoch in Typschaltern nicht zulässig.

Warum ist das so?

Ein Typschalter bestimmt den Typ eines Ausdrucks und weist ihn der im Schalterfall angegebenen Variablen zu. Diese Variable stellt den spezifischen Typ des Ausdrucks an diesem Punkt im Schalter dar.

Wenn Fallthrough zulässig wäre, gäbe es ein Problem mit der Typinkongruenz. Betrachten wir den bereitgestellten Codeausschnitt:

//Empty interface
var x interface{}

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

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

Falls bool wahr ist, wird der Variablen i der Wert von bool innerhalb der Schnittstelle x zugewiesen. Wenn ein Fallthrough zulässig wäre, würde die Ausführung bis zum String-Case fortgesetzt. Zu diesem Zeitpunkt würde die Variable i jedoch immer noch den Bool-Wert enthalten. Diese Typinkongruenz würde zu einem Fehler führen.

Außerdem ist die Fallthrough-Anweisung bei einem Typwechsel nicht sinnvoll, da sie den Typ der Variablen i nicht ändern kann. Typschalter sollen den Typ des Ausdrucks jeweils auf einen bestimmten Typ eingrenzen. Das Zulassen von Fallthrough würde diesen Zweck zunichte machen.

Um das gewünschte Verhalten zu erreichen, kann man in jedem Fall eine Switch-Anweisung mit expliziten Typkonvertierungen verwenden, wie unten gezeigt:

switch i := x.(type) {
case bool, string:
    if b, ok := i.(bool); ok {
        fmt.Println(b) // value as bool
    } else {
        fmt.Printf("%v", i) // value as string
    }
default:
    fmt.Println("Unknown type. Sorry!")
}

Mit diesem Ansatz kann man eine Reihe von Typen innerhalb einer einzigen Switch-Anweisung verarbeiten, ohne dass ein Fallthrough erforderlich ist.

Das obige ist der detaillierte Inhalt vonWarum ist Fallthrough bei Go-Typwechseln verboten?. 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