Switch di tipo
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 18 di 68.
Sebbene le asserzioni di tipo siano efficaci per verificare un singolo tipo, spesso devi gestire più tipi possibili per una variabile di interfaccia. È qui che uno switch di tipo diventa incredibilmente utile: offre un modo chiaro per eseguire azioni diverse in base al tipo concreto.
Un type switch usa questa sintassi speciale: switch v := i.(type). Nota la parola chiave (type) invece di un tipo specifico. La variabile v conterrà il valore effettivo con il suo tipo concreto in ciascun caso:
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 ogni caso, v ha automaticamente il tipo corretto: non è necessaria alcuna asserzione di tipo aggiuntiva. Questo rende gli switch di tipo molto più chiari rispetto a concatenare più asserzioni di tipo con istruzioni if-else, soprattutto quando devi gestire diversi tipi in un unico punto.
Sfida
FacileIn questa sfida, ti eserciterai a usare gli switch di tipo per gestire più tipi di dati in un sistema di notifiche. Creerai una funzione che elabora diversi tipi di notifiche e li formatta in modo appropriato in base al loro tipo concreto.
Riceverai due input:
- Una stringa che rappresenta il tipo di notifica (ad es.
"email","sms","push"o"alert") - Una stringa che rappresenta il contenuto o il valore della notifica
Il tuo compito è:
- Creare una funzione chiamata
processNotificationche accetta un parametrointerface{} - In base all'input del tipo di notifica, convertire il contenuto nel tipo Go appropriato e memorizzarlo in una variabile
interface{}:- Per
"email": usare il contenuto come stringa - Per
"sms": convertire il contenuto in un intero (che rappresenta il conteggio dei caratteri) - Per
"push": convertire il contenuto in un valore booleano (true per "enabled", false per qualsiasi altro valore) - Per
"alert": convertire il contenuto in un float64 (che rappresenta il livello di priorità)
- Per
- Chiamare la funzione
processNotificationcon il valore convertito - All'interno di
processNotification, usare uno switch di tipo per gestire ogni tipo e stampare il messaggio appropriato:- Per
string:"Email notification: [value]" - Per
int:"SMS notification with [value] characters" - Per
bool:"Push notifications: [value]" - Per
float64:"Alert with priority: [value]" - Per qualsiasi altro tipo:
"Unknown notification type"
- Per
Usa il pacchetto strconv per le conversioni da stringa. Per la conversione in valore booleano, solo "enabled" deve restituire true. Questa sfida dimostra come gli switch di tipo offrano un modo chiaro per gestire più tipi in un'unica struttura di controllo, fornendoti automaticamente il valore con il tipo corretto in ciascun caso.
Stampa il float64 nella sua forma più breve, come fanno fmt.Println o i formati %v / %g: 3.5 viene stampato come 3.5 e 1.0 come 1 (il formato %f stamperebbe 1.000000).
Provalo tu
package main
import (
"fmt"
"strconv"
)
func main() {
// Leggi l'input
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Scrivi il tuo codice qui sotto
// 1. Crea la funzione processNotification che accetta un parametro interface{}
// 2. Converti content nel tipo appropriato in base a notificationType
// 3. Chiama processNotification con il valore convertito
// 4. Usa uno switch sui tipi all'interno di processNotification per gestire tipi diversi
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online