Mapas de Structs
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 26 de 68.
Los mapas se vuelven increíblemente potentes cuando almacenas structs como valores. Este patrón te permite organizar datos complejos y estructurados utilizando claves significativas para facilitar la búsqueda y recuperación.
Cuando usas structs como valores de un mapa, esencialmente estás creando una colección donde cada clave apunta a un registro de datos completo. Aquí tienes cómo declarar e inicializar un mapa de este tipo:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Puedes acceder y trabajar con los datos de la estructura a través del mapa como con cualquier otra operación de mapa. Para obtener la información de un estudiante, simplemente usas su nombre como clave:
alice := students["Alice"]
fmt.Println(alice.ID) // imprime: 101
fmt.Println(alice.Grade) // imprime: AEste patrón es extremadamente común en aplicaciones de Go para almacenar colecciones de datos relacionados, como perfiles de usuario, catálogos de productos o ajustes de configuración donde se necesita tanto datos estructurados como un acceso rápido basado en claves.
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ácilCrea un sistema de gestión de calificaciones de estudiantes utilizando mapas con structs como valores. Este desafío demuestra cómo organizar datos complejos de estudiantes utilizando claves significativas para una búsqueda y recuperación eficientes.
Recibirás dos entradas:
- Una cadena que representa el número de estudiantes (por ejemplo,
"4") - Una cadena que contiene los datos de los estudiantes en el formato:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(por ejemplo,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Tu tarea es:
- Definir un struct
Studentcon los siguientes campos:ID(int) - el número de identificación del estudianteGrade(string) - la calificación con letra del estudiante
- Crear un mapa donde las claves sean los nombres de los estudiantes (strings) y los valores sean structs
Student - Analizar los datos de los estudiantes de la segunda entrada:
- Dividir la entrada por comas para obtener las entradas individuales de los estudiantes
- Para cada entrada, dividir por dos puntos para separar el nombre, el ID y la calificación
- Convertir la cadena del ID en un entero
- Crear un struct
Studenty añadirlo al mapa con el nombre como clave
- Mostrar todos los estudiantes en orden alfabético por nombre en el formato:
"[name]: ID [id], Grade [grade]" - Calcular y mostrar estadísticas de calificaciones:
- Contar cuántos estudiantes tienen cada calificación (A, B, C, D, F)
- Mostrar el recuento de cada calificación que aparezca en el formato:
"Grade [grade]: [count] students" - Mostrar las calificaciones en orden alfabético (A, B, C, D, F)
- Buscar y mostrar al estudiante con el ID más alto en el formato:
"Highest ID: [name] ([id])" - Mostrar el número total de estudiantes:
"Total students: [count]"
Utiliza el paquete strconv para convertir la cadena del ID en un entero, y el paquete sort para ordenar los nombres de los estudiantes alfabéticamente. Este desafío demuestra cómo los mapas con valores de struct proporcionan una forma eficiente de organizar y acceder a colecciones de datos complejos utilizando identificadores significativos.
Hoja de referencia
Los mapas pueden almacenar structs como valores, creando colecciones donde cada clave apunta a un registro de datos completo:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Accede a los datos del struct a través del mapa utilizando la clave:
alice := students["Alice"]
fmt.Println(alice.ID) // imprime: 101
fmt.Println(alice.Grade) // imprime: AEste patrón se utiliza comúnmente para almacenar colecciones de datos relacionados, como perfiles de usuario, catálogos de productos o ajustes de configuración, donde se necesitan tanto datos estructurados como un acceso rápido basado en claves.
Pruébalo tú mismo
package main
import (
"fmt"
)
func main() {
// Leer entrada
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Definir la estructura Student aquí
// TODO: Crear un mapa para almacenar estudiantes (nombre como clave, estructura Student como valor)
// TODO: Analizar los datos de los estudiantes y poblar el mapa
// TODO: Mostrar todos los estudiantes en orden alfabético por nombre
// TODO: Calcular y mostrar estadísticas de calificaciones
// TODO: Buscar y mostrar al estudiante con el ID más alto
// TODO: Mostrar el número total de estudiantes
}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