Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

In 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 è:

  1. Creare una funzione chiamata processNotification che accetta un parametro interface{}
  2. 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à)
  3. Chiamare la funzione processNotification con il valore convertito
  4. 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"

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(&notificationType)
	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
	
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online