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 la memoria. Comprender este concepto es crucial, porque intentar agregar claves a un mapa nil hará que tu programa entre en pánico y se bloquee.

Así es como ocurre un mapa nil y cómo se ve:

var myMap map[string]int
// myMap es nil en este punto

Cuando declaras una variable de tipo mapa sin inicializarla, Go la establece automáticamente en nil. Aunque puedes leer de forma segura un mapa nil (devolverá el valor cero), intentar escribir en él provocará un pánico:

// 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 comprobación sencilla garantiza que tu programa no se bloquee al trabajar con mapas potencialmente no inicializados, lo que hace que tu código sea más sólido y confiable.

challenge icon

Desafío

Fácil

Crea un sistema seguro de inicialización de mapas que evite errores de pánico comprobando si los mapas son nil antes de intentar realizar operaciones de escritura. Este desafío demuestra la importancia fundamental de validar el estado de un 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 separadas por comas. Cada operación indica el mapa en el que trabaja:
    • "check:[map_name]"
    • "init:[map_name]"
    • "add:[map_name]:[key]:[value]"
    Por ejemplo, "check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"

Tu tarea consiste en:

  1. Crear dos variables de mapa de tipo map[string]int llamadas scores y grades sin inicializarlas (serán nil)
  2. Procesar secuencialmente cada operación de la cadena de entrada:
  3. Para las operaciones "check":
    • Comprobar 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 las operaciones "init":
    • Inicializar el mapa especificado mediante make(map[string]int)
    • Imprimir "Initialized map [map_name]"
  5. Para las operaciones "add":
    • Comprobar primero 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 las operaciones individuales
    • Para cada operación, dividir por dos puntos para obtener el tipo de operación y los parámetros
    • Convertir la cadena del valor en 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
    • Imprimir scores primero y grades después, independientemente del orden en que las operaciones los hayan utilizado

Usa el paquete strconv para convertir las cadenas de valores en enteros para las operaciones add. Este desafío demuestra cómo comprobar si los mapas son nil antes de las operaciones de escritura evita los pánicos en tiempo de ejecución y hace que tu código sea sólido y confiable.

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 debajo
	// 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
	
	// Mostrar el estado final de ambos mapas
	// Comprobar 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

Practica por tu cuenta: Compilador de Go online