Verificación de Maps Nil
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 28 de 68.
En Go, un mapa puede tener un estado especial llamado nil. Un mapa nil es esencialmente un mapa no inicializado que no apunta a nada en memoria. Comprender este concepto es crucial porque intentar agregar claves a un mapa nil hará que tu programa entre en pánico (panic) y falle.
Así es como ocurre un mapa nil y qué aspecto tiene:
var myMap map[string]int
// myMap es nil en este puntoCuando declaras una variable de tipo map sin inicializarla, Go la establece automáticamente en nil. Si bien puedes leer de forma segura de un mapa nil (devolverá el valor cero), intentar escribir en él provocará un pánico (panic):
// Esto es seguro - devuelve 0
value := myMap["key"]
// ¡Esto provocará un pánico!
myMap["key"] = 42Para evitar este problema, siempre debes comprobar si un mapa es nil antes de intentar añadirle claves. La comprobación es sencilla:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Ahora esto es seguroEsta sencilla comprobación asegura que su programa no fallará al trabajar con mapas potencialmente no inicializados, lo que hace que su código sea más robusto y confiable.
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 inicialización de mapas seguro que evite errores de pánico verificando si los mapas son nil antes de intentar realizar operaciones de escritura. Este desafío demuestra la importancia crítica de validar el estado del mapa antes de realizar operaciones que podrían bloquear tu programa.
Recibirás dos entradas:
- Una cadena que representa el número de operaciones (por ejemplo,
"5") - Una cadena que contiene operaciones en el formato:
"operation1:key1:value1,operation2:key2:value2"donde las operaciones son"check","init"o"add"(por ejemplo,"check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
Tu tarea es:
- Crear dos variables de mapa de tipo
map[string]intllamadasscoresygradessin inicializarlas (serán nil) - Procesar cada operación de la cadena de entrada secuencialmente:
- Para operaciones
"check":- Verificar si el mapa especificado es nil
- Imprimir
"Map [map_name] is nil"si el mapa es nil - Imprimir
"Map [map_name] is initialized"si el mapa no es nil
- Para operaciones
"init":- Inicializar el mapa especificado usando
make(map[string]int) - Imprimir
"Initialized map [map_name]"
- Inicializar el mapa especificado usando
- Para operaciones
"add":- Primero verificar si el mapa es nil
- Si el mapa es nil, imprimir
"Cannot add to nil map [map_name]" - Si el mapa no es nil, añadir el par clave-valor e imprimir
"Added [key]:[value] to [map_name]"
- Analizar las operaciones dividiendo la cadena de entrada:
- Dividir por comas para obtener operaciones individuales
- Para cada operación, dividir por dos puntos para obtener el tipo de operación y los parámetros
- Convertir la cadena de valor a un entero para las operaciones add
- Después de procesar todas las operaciones, mostrar el estado final de ambos mapas:
- Para cada mapa, si es nil:
"Final state - [map_name]: nil" - Para cada mapa, si está inicializado:
"Final state - [map_name]: [count] entries"donde count es el número de pares clave-valor
- Para cada mapa, si es nil:
Usa el paquete strconv para convertir las cadenas de valor a enteros para las operaciones add. Este desafío demuestra cómo verificar si los mapas son nil antes de las operaciones de escritura evita pánicos en tiempo de ejecución y hace que tu código sea robusto y confiable.
Hoja de referencia
Un mapa nil es un mapa no inicializado que no apunta a nada en memoria. Intentar agregar claves a un mapa nil causará que su programa entre en pánico (panic) y se bloquee.
Declarar un mapa sin inicializarlo crea un mapa nil:
var myMap map[string]int
// myMap is nil at this pointLeer de un mapa nil es seguro (devuelve el valor cero), pero escribir en él provocará un pánico:
// This is safe - returns 0
value := myMap["key"]
// This will panic!
myMap["key"] = 42Siempre verifique si un mapa es nil antes de agregar claves:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Now this is safePruébalo tú mismo
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Leer entrada
var numOpsStr string
var operationsStr string
fmt.Scanln(&numOpsStr)
fmt.Scanln(&operationsStr)
// Declarar mapas sin inicialización (serán nil)
var scores map[string]int
var grades map[string]int
// Dividir operaciones por coma
operations := strings.Split(operationsStr, ",")
// TODO: Escribe tu código a continuación
// Procesar cada operación secuencialmente
// Manejar las operaciones "check", "init" y "add"
// Para las operaciones add, usa strconv.Atoi() para convertir la cadena de valor a entero
// Imprimir el estado final de ambos mapas
// Verificar si los mapas son nil o están inicializados e imprimir en consecuencia
}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