Menu
Coddy logo textTech

Interfaz vacía

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

Hasta ahora has trabajado con interfaces que requieren métodos específicos, pero Go tiene una interfaz especial que es increíblemente flexible: la interfaz vacía, escrita como interface{}.

La interfaz vacía no tiene requisitos de método en absoluto, lo que significa que cualquier tipo en Go la satisface automáticamente. Dado que cada tipo implementa cero métodos (como mínimo), cada tipo puede ser asignado a una variable interface{}:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

Esto hace que interface{} sea extremadamente útil cuando necesitas trabajar con datos de tipos desconocidos o variables. Podrías encontrarte con esto al leer archivos de configuración, gestionar la entrada del usuario o al trabajar con APIs que devuelven diferentes tipos de datos dependiendo de la situación.

Sin embargo, dado que la interfaz vacía puede contener cualquier tipo, a menudo necesitarás determinar qué tipo está almacenado realmente en su interior antes de poder usar el valor de manera significativa. Aquí es donde las aserciones de tipo (type assertions) y los interruptores de tipo (type switches) (sobre los cuales aprenderás a continuación) se convierten en herramientas esenciales para trabajar de forma segura con valores interface{}.

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 trabajo con la interfaz vacía creando un procesador de datos que puede manejar diferentes tipos de valores. Crearás una función que acepte un parámetro interface{} y procese varios tipos de datos.

Recibirás dos entradas:

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

Tu tarea es:

  1. Crear una función llamada processData que tome un parámetro interface{} e imprima información sobre el valor
  2. Basándote en la entrada del tipo de dato, convierte la cadena del valor al tipo de Go apropiado:
    • Para "int": convertir a entero
    • Para "string": usar como cadena
    • Para "bool": convertir a booleano
    • Para "slice": convertir los valores separados por comas en un slice de enteros
  3. Llamar a la función processData con el valor convertido
  4. Dentro de processData, imprime el valor y su tipo en el formato: "Value: [value], Type: [type]"

Para la entrada de slice, la cadena separada por comas como "1,2,3" debe convertirse en []int{1, 2, 3}. La función debe funcionar con cualquier tipo ya que acepta interface{}, demostrando cómo la interfaz vacía puede contener valores de cualquier tipo. Usa fmt.Printf con los verbos de formato %v y %T para mostrar el valor y el tipo respectivamente.

Hoja de referencia

La interfaz vacía interface{} no tiene requisitos de método, lo que significa que cualquier tipo en Go la satisface automáticamente:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

La interfaz vacía es útil para trabajar con datos de tipos desconocidos o variables, como archivos de configuración, entrada de usuario o APIs que devuelven diferentes tipos de datos.

Usa fmt.Printf con los verbos de formato %v y %T para mostrar el valor y el tipo de una variable interface{}:

fmt.Printf("Value: %v, Type: %T", value, value)

Ayudantes de conversión útiles de la biblioteca estándar:

import (
    "strconv"
    "strings"
)

// Convertir string a int
n, err := strconv.Atoi("42")       // n = 42

// Convertir string a bool
b, err := strconv.ParseBool("true") // b = true

// Dividir un string en un slice
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]

Pruébalo tú mismo

package main

import (
	"fmt"
)

func main() {
	// Leer entrada
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// TODO: Escribe tu código a continuación
	// 1. Crea la función processData que acepte interface{}
	// 2. Convierte valueStr al tipo apropiado basado en dataType
	// 3. Llama a processData con el valor convertido
	
}
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