Lektionen des Moduls (3/5)
Type-Switch
Ein Typschalter unterscheidet zwischen mehreren möglichen Typen einer
Schnittstellenwert. Es ist die Verallgemeinerung von comma ok, wenn es welche gibt
mehr als ein Fall.
Syntax
func describe(i interface{}) string {
switch v := i.(type) {
case int:
return fmt.Sprintf("int %d", v)
case string:
return fmt.Sprintf("string %q", v)
case nil:
return "nil"
default:
return fmt.Sprintf("altro tipo: %T", v)
}
}i.(type)ist eine spezielle Syntax, die NUR innerhalb vonswitchgültig ist.v := ...bindet den Wert an den Typ des aktuellen Falls: Innerhalb voncase inthatvden Typint.defaultfängt alle anderen Typen ab; dort hatvden Typ der Originalschnittstelle.case nilgleicht die Schnittstelle mit einem dynamischen Nulltyp ab.
„Namenloser“ Fall
Wenn Sie den eingegebenen Wert nicht benötigen, können Sie v weglassen:
switch i.(type) {
case int:
// you know it's an int, but you don't have a variable of that type
case string:
// ...
}Ein Formular, das verwendet wird, wenn Sie nur den Typ unterscheiden und nicht ausführen müssen auf den Wert.
Mehrere Typen im selben Fall
switch v := i.(type) {
case int, int64:
// here v is still interface{}: the "common" type is just the interface
fmt.Println("numero intero:", v)
case string:
// here v is string
fmt.Println("stringa:", v)
}Typischer Anwendungsfall: formatiertes Drucken
func print(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("%d\n", v)
case string:
fmt.Printf("%s\n", v)
case fmt.Stringer:
fmt.Println(v.String())
default:
fmt.Printf("%v\n", v)
}
}fmt.Println selbst verwendet intern einen Typschalter, um das zu verarbeiten
Standardformate.
Typschalter vs. Reflexion
Für einige bekannte Typen → Typschalter (schnell, lesbar).
Zur dynamischen Inspektion unbekannter Typen → das reflect-Paket (mehr
kraftvoll, aber langsamer und ausführlicher).
Probieren Sie es aus
Implementieren Sie eine Beschreibungszeichenfolge (i interface{}), die je nach dynamischem Typ „int“, „string“ oder „altro“ zurückgibt.
Hinweis anzeigen
Syntax: `switch i.(type) { case T: ... default: ... }`.
Lösung nach 3 Versuchen verfügbar
Schreiben Sie printVal(i interface{}), das v := i.(type) verwendet und mit %d für int, %s für string druckt.
Hinweis anzeigen
Innerhalb von `case int` hat v den Typ int (Sie können ihn an Printf übergeben).
Lösung nach 3 Versuchen verfügbar
Welche Syntax startet einen Typwechsel?
switch ??? {
case int: ...
}Zusammenfassung
switch v := i.(type) { case T: ... }: unterscheidet den dynamischen Typ. – In einem Einzeltyp-Fall enthältvden Typ des Falles.case T1, T2:vbehält den Typ der ursprünglichen Schnittstelle bei.defaultfür nicht bearbeitete Fälle;case nilfür die Null-Schnittstelle.- Kein
fallthroughin Typschaltern. - 1 Typ → Typzusicherung; 2+ Typen → Typschalter.