Type Switch
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 18 von 68.
Während Typzusicherungen sich gut zur Überprüfung eines einzelnen Typs eignen, musst du häufig mehrere mögliche Typen für eine Schnittstellenvariable behandeln. Hier erweist sich ein Typswitch als äußerst nützlich – er bietet eine übersichtliche Möglichkeit, je nach konkretem Typ unterschiedliche Aktionen auszuführen.
Ein Typ-Schalter verwendet diese spezielle Syntax: switch v := i.(type). Beachte das Schlüsselwort (type) anstelle eines spezifischen Typs. Die Variable v enthält in jedem Fall den tatsächlichen Wert mit seinem konkreten Typ:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}In jedem Fall hat v automatisch den richtigen Typ – eine zusätzliche Typzusicherung ist nicht erforderlich. Dadurch werden Typschalter deutlich übersichtlicher als das Verketten mehrerer Typzusicherungen mit If-Else-Anweisungen, insbesondere wenn du mehrere verschiedene Typen an einer Stelle behandeln musst.
Aufgabe
EinfachIn dieser Herausforderung übst du die Verwendung von Typswitches, um mehrere Datentypen in einem Benachrichtigungssystem zu verarbeiten. Du erstellst eine Funktion, die verschiedene Arten von Benachrichtigungen verarbeitet und sie abhängig von ihrem konkreten Typ entsprechend formatiert.
Du erhältst zwei Eingaben:
- Eine Zeichenkette, die den Benachrichtigungstyp darstellt (z. B.
"email","sms","push"oder"alert") - Eine Zeichenkette, die den Inhalt oder Wert der Benachrichtigung darstellt
Deine Aufgabe ist es:
- Eine Funktion namens
processNotificationzu erstellen, die eineninterface{}-Parameter übernimmt - Den Inhalt abhängig von der Eingabe des Benachrichtigungstyps in den entsprechenden Go-Typ umzuwandeln und ihn in einer
interface{}-Variable zu speichern:- Für
"email": den Inhalt als Zeichenkette verwenden - Für
"sms": den Inhalt in eine Ganzzahl umwandeln (die die Zeichenanzahl darstellt) - Für
"push": den Inhalt in einen booleschen Wert umwandeln (true für "enabled", false für alles andere) - Für
"alert": den Inhalt in einen float64 umwandeln (der die Prioritätsstufe darstellt)
- Für
- Die Funktion
processNotificationmit dem umgewandelten Wert aufzurufen - Innerhalb von
processNotificationeinen Typswitch zu verwenden, um jeden Typ zu verarbeiten und die entsprechende Nachricht auszugeben:- Für
string:"Email notification: [value]" - Für
int:"SMS notification with [value] characters" - Für
bool:"Push notifications: [value]" - Für
float64:"Alert with priority: [value]" - Für jeden anderen Typ:
"Unknown notification type"
- Für
Verwende das Paket strconv für Zeichenkettenkonvertierungen. Bei der booleschen Konvertierung soll nur "enabled" zu true führen. Diese Herausforderung zeigt, wie Typswitches eine übersichtliche Möglichkeit bieten, mehrere Typen innerhalb einer einzigen Kontrollstruktur zu verarbeiten, wobei automatisch der korrekt typisierte Wert in jedem Fall bereitgestellt wird.
Gib den float64 in seiner kürzesten Form aus, so wie es fmt.Println oder die Operatoren %v / %g tun: 3.5 wird als 3.5 und 1.0 als 1 ausgegeben (der Operator %f würde 1.000000 ausgeben).
Probier es selbst
package main
import (
"fmt"
"strconv"
)
func main() {
// Eingabe lesen
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Schreibe deinen Code darunter
// 1. Create processNotification function that takes interface{} parameter
// 2. Convert content to appropriate type based on notificationType
// 3. Call processNotification with the converted value
// 4. Use type switch inside processNotification to handle different types
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler