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!