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.
Desafío
FácilCrea un sistema de gestión de calificaciones de estudiantes usando mapas con estructuras como valores. Este desafío demuestra cómo organizar datos complejos de estudiantes mediante claves significativas para realizar búsquedas y recuperar información de forma eficiente.
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 una estructura
Studentcon los siguientes campos:ID(int): el número de identificación del estudianteGrade(string): la calificación de letra del estudiante
- Crear un mapa cuyas claves sean los nombres de los estudiantes (cadenas) y cuyos valores sean estructuras
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 una estructura
Studenty añadirla al mapa usando el nombre como clave
- Mostrar todos los estudiantes en orden alfabético por nombre con el formato:
"[name]: ID [id], Grade [grade]" - Calcular y mostrar las estadísticas de las calificaciones:
- Contar cuántos estudiantes tienen cada calificación (A, B, C, D, F)
- Mostrar el recuento de cada calificación que aparezca con el formato:
"Grade [grade]: [count] students" - Mostrar las calificaciones en orden alfabético (A, B, C, D, F)
- Encontrar y mostrar el estudiante con el ID más alto con el formato:
"Highest ID: [name] ([id])" - Mostrar el número total de estudiantes:
"Total students: [count]"
Usa el paquete strconv para convertir la cadena del ID en un entero y el paquete sort para ordenar alfabéticamente los nombres de los estudiantes. Este desafío demuestra cómo los mapas con valores de tipo estructura proporcionan una forma eficiente de organizar y acceder a colecciones de datos complejas mediante identificadores significativos.
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 comportamientosPractica por tu cuenta: Compilador de Go online