Menu
Coddy logo textTech

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 punto

Cuando 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"] = 42

Para 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 seguro

Esta 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.

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

Crea 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:

  1. Crear dos variables de mapa de tipo map[string]int llamadas scores y grades sin inicializarlas (serán nil)
  2. Procesar cada operación de la cadena de entrada secuencialmente:
  3. 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
  4. Para operaciones "init":
    • Inicializar el mapa especificado usando make(map[string]int)
    • Imprimir "Initialized map [map_name]"
  5. 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]"
  6. 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
  7. 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

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 point

Leer 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"] = 42

Siempre verifique si un mapa es nil antes de agregar claves:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // Now this is safe

Prué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
}
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