Saltar al contenido principal
eLearner.app
Módulo 6 · Lección 3 de 528/50 en el curso~10 min
Lecciones del módulo (3/5)

Type switch

Un cambio de tipo discrimina entre múltiples tipos posibles de un valor de la interfaz. Es la generalización de comma ok cuando hay más de un caso.

Sintaxis

Go
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) es una sintaxis especial, válida SÓLO dentro de switch.
  • v := ... vincula el valor con el tipo de caso actual: dentro de case int, v tiene el tipo int.
  • default captura todos los demás tipos; allí v tiene el tipo de interfaz original.
  • case nil hace coincidir la interfaz con un tipo dinámico nulo.

Caso "sin nombre"

Si no necesita el valor escrito, puede omitir v:

Go
switch i.(type) {
case int:
    // you know it's an int, but you don't have a variable of that type
case string:
    // ...
}

Un formulario utilizado cuando solo necesitas discriminar el tipo, no operar sobre el valor.

Varios tipos en el mismo caso

Go
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)
}

Caso de uso típico: impresión formateada

Go
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)
    }
}

El propio fmt.Println utiliza un interruptor de tipo internamente para manejar el formatos estándar.

Tipo de cambio vs reflexión

Para algunos tipos conocidos → escriba switch (rápido, legible). Para inspección dinámica de tipos desconocidos → el paquete reflect (más potente pero más lento y más detallado).

Pruébalo

Ejercicio#go.m6.l3.e1
Intentos: 0Cargando...

Implemente la cadena describe(i interface{}) que devuelve 'int', 'string' o 'altro' según el tipo dinámico.

Cargando editor...
Mostrar pista

Sintaxis: `switch i.(type) { case T: ... default: ... }`.

Solución disponible después de 3 intentos

Ejercicio#go.m6.l3.e2
Intentos: 0Cargando...

Escriba printVal(i interfaz{}) que use v := i.(tipo) e imprima con %d para int, %s para cadena.

Cargando editor...
Mostrar pista

Dentro de `case int`, v tiene el tipo int (puedes pasarlo a Printf).

Solución disponible después de 3 intentos

Cuestionario#go.m6.l3.e3
Listo

¿Qué sintaxis inicia un cambio de tipo?

Go
switch ??? {
  case int: ...
}
Opciones de respuesta

Resumen

  • switch v := i.(type) { case T: ... }: discrimina por el tipo dinámico.
  • Dentro de un caso de un solo tipo, v tiene el tipo de caso.
  • case T1, T2: v mantiene el tipo de interfaz original.
  • default para casos no tratados; case nil para la interfaz nula.
  • No fallthrough en interruptores tipo.
  • 1 tipo → tipo de afirmación; 2+ tipos → interruptor de tipo.