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 increíblemente flexible: la interfaz vacía, escrita como interface{}.
La interfaz vacía no tiene ningún requisito de métodos, lo que significa que cualquier tipo en Go la satisface automáticamente. Dado que todo tipo implementa cero métodos (como mínimo), cualquier tipo puede asignarse a una variable interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceEsto hace que interface{} sea extremadamente útil cuando necesitas trabajar con data de type desconocidos o variables. Puedes encontrarte con esto al leer archivos de configuración, gestionar input del usuario o trabajar con APIs que devuelven diferentes data de type según la situación.
Sin embargo, dado que la interfaz vacía puede contener cualquier tipo, a menudo tendrás que determinar qué tipo está almacenado realmente en ella antes de poder usar el valor de manera significativa. Aquí es donde las aserciones de tipo y los switches de tipo (sobre los que aprenderás a continuación) se convierten en herramientas esenciales para trabajar de forma segura con valores de interface{}.
Desafío
FácilEn este desafío, practicarás el trabajo con la interfaz vacía mediante la creación de un procesador de datos que pueda manejar distintos 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 datos (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:
- Crear una función llamada
processDataque reciba un parámetrointerface{}e imprima información sobre el valor - Según la entrada del tipo de datos, convertir la cadena de valor al tipo de Go correspondiente:
- Para
"int": convertir a un entero - Para
"string": usar como cadena - Para
"bool": convertir a un valor booleano - Para
"slice": convertir los valores separados por comas en un slice de enteros
- Para
- Llamar a la función
processDatacon el valor convertido - Dentro de
processData, imprimir el valor y su tipo con el formato:"Value: [value], Type: [type]"
Para la entrada de tipo 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{}, lo que demuestra 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.
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 debajo
// 1. Crea la función processData que acepta interface{}
// 2. Convierte valueStr al tipo apropiado basándote en dataType
// 3. Llama a processData con el valor convertido
}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 comportamientosPractica por tu cuenta: Compilador de Go online