Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist Fallthrough bei Switches vom Typ Go nicht zulässig?

Warum ist Fallthrough bei Switches vom Typ Go nicht zulässig?

Barbara Streisand
Barbara StreisandOriginal
2024-11-12 11:41:01646Durchsuche

Why is fallthrough not allowed in Go's type switches?

Typschalter vs. normale Switch-Anweisungen

In Go ist Fallthrough in normalen Switch-Anweisungen zulässig, jedoch nicht in Typschaltern. Während die Go-Spezifikation den Grund für diese Diskrepanz nicht explizit erklärt, ergibt sie sich aus den zugrunde liegenden Unterschieden in den beiden Konstrukten.

Normale Switch-Anweisungen:

In einer normalen Bei einer Switch-Anweisung wird der Switch-Ausdruck zu einem einzelnen konstanten Wert eines bestimmten Typs ausgewertet. Dieser Wert wird dann mit den Konstanten in den Case-Anweisungen verglichen. Wenn der Switch-Ausdruck mit einer Konstante übereinstimmt, wird der entsprechende Case-Block ausgeführt.

Fallthrough in normalen Switch-Anweisungen ermöglicht die Fortsetzung der Ausführung mit dem nächsten Case-Block, unabhängig davon, ob der Switch-Ausdruck mit der Case-Konstante übereinstimmt. Dieses Verhalten kann nützlich sein, wenn aufeinanderfolgende Case-Anweisungen verwandte Szenarien behandeln.

Typschalter:

Typschalter hingegen werten den Schalterausdruck in einen Schnittstellenwert aus . Der Typ des Schnittstellenwerts wird dann zur Laufzeit dynamisch ermittelt und mit den in den Case-Anweisungen angegebenen Typen verglichen. Abhängig von der Übereinstimmung wird der entsprechende Case-Block ausgeführt.

Im Gegensatz zu normalen Switch-Anweisungen ist Fallthrough bei Typ-Switches nicht zulässig, da er nicht konsistent angewendet werden kann. Der Grund dafür ist, dass der Schalterausdruck in einem Typschalter einen Schnittstellenwert eines beliebigen Typs zurückgeben kann. Wenn Fallthrough zulässig wäre, würde sich der Typ des Switch-Ausdrucks ändern, wenn er von einem Case-Block zum nächsten übergeht.

Betrachten Sie beispielsweise den folgenden Typschalter:

switch i := x.(type) {
case int:
    fmt.Println(i + 1)
    fallthrough // Error: cannot fallthrough in type switch
case float64:
    fmt.Println(i + 2.0)
}

Hier Code: Wenn der Schalterausdruck x eine Ganzzahl ist, wird der Case-Int-Block ausgeführt. Wenn ein Fallthrough zulässig wäre, würde die Ausführung bis zum case float64-Block fortgesetzt. An diesem Punkt würde sich jedoch der Typ des Schalterausdrucks von int zu float64 ändern.

Dies würde zu einer Unterbrechung der Typkonsistenz führen, da die nachfolgende case-Anweisung erwartet, dass der Schalterausdruck ein float64 ist. Um die Konsistenz zu gewährleisten, ist Fallthrough in Typwechseln nicht zulässig.

Alternative Ansätze für die bedingte Typverarbeitung:

Wenn Sie mehrere Typen auf bedingte Weise verarbeiten müssen, finden Sie hier sind alternative Ansätze für Typschalter:

  • Verwenden Sie mehrere normale Switch-Anweisungen: Erstellen Sie separate Switch-Anweisungen für jeden Typ, den Sie verarbeiten müssen.
  • Verwenden Sie die leere Schnittstellentypzusicherung: Verwenden Sie die Typzusicherung .(interface{}), um den Typ des Schnittstellenwerts zu überprüfen, und verarbeiten Sie dann den Wert entsprechend.

Das obige ist der detaillierte Inhalt vonWarum ist Fallthrough bei Switches vom Typ 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