Menu
Coddy logo textTech

Aserciones de tipo

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 17 de 68.

Al trabajar con variables de interfaz, a menudo es necesario acceder al valor concreto real almacenado dentro de ellas. Aquí es donde entran en juego las aserciones de tipo: permiten extraer y utilizar de forma segura el valor subyacente.

Una aserción de tipo utiliza esta sintaxis: value, ok := interfaceVariable.(Type). El primer valor de retorno es el valor extraído del tipo especificado, y el segundo es un booleano que indica si la aserción fue exitosa.

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

La variable ok es crucial para la seguridad. Si intentas realizar una aserción al tipo incorrecto, ok será false y value será el valor cero de ese tipo. Sin comprobar ok, una aserción de tipo fallida causaría que tu programa entre en pánico.

Las aserciones de tipo son esenciales cuando se trabaja con valores interface{}, lo que le permite convertir la interfaz genérica de nuevo a un tipo específico para que pueda utilizar sus métodos y operaciones.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

En este desafío, practicarás el uso de aserciones de tipo para extraer y trabajar de forma segura con valores concretos de variables de interfaz. Crearás un analizador de datos que procesa diferentes tipos de valores almacenados en interfaces vacías.

Recibirás dos entradas:

  • Una cadena que representa el tipo de dato a verificar (por ejemplo, "int", "string" o "bool")
  • Una cadena que representa el valor real (por ejemplo, "42", "hello" o "true")

Tu tarea es:

  1. Convertir la cadena del valor al tipo de Go apropiado y almacenarla en una variable interface{}:
    • Para "int": convertir a entero
    • Para "string": usar como cadena
    • Para "bool": convertir a booleano
  2. Usar la aserción de tipo para verificar si la variable de interfaz contiene el tipo esperado especificado en la primera entrada
  3. Si la aserción de tipo tiene éxito, imprimir: "Success: [value] is a [type]"
  4. Si la aserción de tipo falla, imprimir: "Failed: value is not a [type]"

Debes usar la sintaxis de aserción de tipo segura con la variable ok para verificar si la aserción fue exitosa. El desafío pone a prueba tu comprensión de cómo extraer de forma segura valores concretos de variables de interfaz sin que tu programa entre en pánico.

Para la conversión booleana, "true" debe convertirse en true y cualquier otra cadena debe convertirse en false. Utiliza el paquete strconv para la conversión de cadena a entero.

Hoja de referencia

Las aserciones de tipo te permiten extraer valores concretos de variables de interfaz usando la sintaxis value, ok := interfaceVariable.(Type):

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

La variable ok indica si la aserción fue exitosa. Si es false, value será el valor cero de ese tipo. Siempre verifica ok para prevenir panics por aserciones fallidas.

Pruébalo tú mismo

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// Leer entrada
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// Variable para almacenar el valor de la interfaz
	var interfaceValue interface{}
	
	// TODO: Escribe tu código abajo
	// 1. Convierte valueStr al tipo apropiado basado en dataType y almacénalo en interfaceValue
	// 2. Usa la aserción de tipo para verificar si interfaceValue contiene el tipo esperado
	// 3. Imprime el mensaje de éxito o fallo apropiado
	
}
quiz iconPonte a prueba

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