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 puntoCuando 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"] = 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 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.
Desafío
FácilCrea 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]"
"check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"
Tu tarea consiste en:
- Crear dos variables de mapa de tipo
map[string]intllamadasscoresygradessin inicializarlas (serán nil) - Procesar secuencialmente cada operación de la cadena de entrada:
- 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
- Para las operaciones
"init":- Inicializar el mapa especificado mediante
make(map[string]int) - Imprimir
"Initialized map [map_name]"
- Inicializar el mapa especificado mediante
- 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]"
- 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
- 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
scoresprimero ygradesdespués, independientemente del orden en que las operaciones los hayan utilizado
- Para cada mapa, si es nil:
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
}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