Type Switch
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 18 de 68.
Mientras que las aserciones de tipo funcionan bien para comprobar un solo tipo, a menudo es necesario manejar múltiples tipos posibles para una variable de interfaz. Aquí es donde un type switch resulta increíblemente útil: proporciona una forma limpia de realizar diferentes acciones basadas en el tipo concreto.
Un switch de tipo utiliza esta sintaxis especial: switch v := i.(type). Observa la palabra clave (type) en lugar de un tipo específico. La variable v contendrá el valor real con su tipo concreto en cada 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)
}
}En cada caso, v tiene automáticamente el tipo correcto - no se necesita ninguna aserción de tipo adicional. Esto hace que los switches de tipo sean mucho más limpios que encadenar múltiples aserciones de tipo con sentencias if-else, especialmente cuando necesitas manejar varios tipos diferentes en un solo lugar.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilEn este desafío, practicarás el uso de interruptores de tipo (type switches) para manejar múltiples tipos de datos en un sistema de notificaciones. Crearás una función que procese diferentes tipos de notificaciones y les dé el formato adecuado según su tipo concreto.
Recibirás dos entradas:
- Una cadena que representa el tipo de notificación (por ejemplo,
"email","sms","push"o"alert") - Una cadena que representa el contenido o valor de la notificación
Tu tarea es:
- Crear una función llamada
processNotificationque reciba un parámetrointerface{} - Basándote en la entrada del tipo de notificación, convierte el contenido al tipo de Go adecuado y almacénalo en una variable
interface{}:- Para
"email": usa el contenido como un string - Para
"sms": convierte el contenido a un entero (que representa el recuento de caracteres) - Para
"push": convierte el contenido a un booleano (true para"enabled", false para cualquier otra cosa) - Para
"alert": convierte el contenido a un float64 (que representa el nivel de prioridad)
- Para
- Llamar a la función
processNotificationcon el valor convertido - Dentro de
processNotification, usa un type switch para manejar cada tipo e imprimir el mensaje correspondiente:- Para
string:"Email notification: [value]" - Para
int:"SMS notification with [value] characters" - Para
bool:"Push notifications: [value]" - Para
float64:"Alert with priority: [value]" - Para cualquier otro tipo:
"Unknown notification type"
- Para
Utiliza el paquete strconv para las conversiones de cadenas. Para la conversión booleana, solo "enabled" debe dar como resultado true. Este desafío demuestra cómo los type switches proporcionan una forma limpia de manejar múltiples tipos en una sola estructura de control, dándote automáticamente el valor con el tipo correcto en cada caso.
Hoja de referencia
Un switch de tipo (type switch) proporciona una forma limpia de manejar múltiples tipos posibles para una variable de interfaz utilizando la sintaxis switch v := i.(type):
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)
}
}En cada caso, la variable v tiene automáticamente el tipo concreto correcto, eliminando la necesidad de aserciones de tipo adicionales.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
)
func main() {
// Leer entrada
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Escribe tu código a continuación
// 1. Crea la función processNotification que tome un parámetro interface{}
// 2. Convierte el contenido al tipo apropiado basado en notificationType
// 3. Llama a processNotification con el valor convertido
// 4. Usa un type switch dentro de processNotification para manejar diferentes tipos
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos