Tester les Maps Nil
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 28 sur 68.
En Go, une map peut avoir un état spécial appelé nil. Une map nil est essentiellement une map non initialisée qui ne pointe vers rien en mémoire. Comprendre ce concept est crucial car tenter d'ajouter des clés à une map nil provoquera une panique (panic) et le plantage de votre programme.
Voici comment une map nil apparaît et à quoi elle ressemble :
var myMap map[string]int
// myMap est nil à ce stadeLorsque vous déclarez une variable de type map sans l'initialiser, Go la définit automatiquement sur nil. Bien que vous puissiez lire en toute sécurité à partir d'une map nil (elle retournera la valeur zéro), tenter d'y écrire provoquera un panic :
// C'est sûr - retourne 0
value := myMap["key"]
// Cela provoquera un panic !
myMap["key"] = 42Pour éviter ce problème, vous devriez toujours vérifier si une map est nil avant de tenter d'y ajouter des clés. La vérification est simple :
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Maintenant, c'est sûrCette simple vérification garantit que votre programme ne plantera pas lors de l'utilisation de maps potentiellement non initialisées, rendant votre code plus robuste et fiable.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileCréez un système d'initialisation de map sécurisé qui empêche les erreurs de panique en vérifiant les maps nil avant de tenter des opérations d'écriture. Ce défi démontre l'importance critique de valider l'état d'une map avant d'effectuer des opérations qui pourraient faire planter votre programme.
Vous recevrez deux entrées :
- Une chaîne représentant le nombre d'opérations (par exemple,
"5") - Une chaîne contenant les opérations au format :
"operation1:key1:value1,operation2:key2:value2"où les opérations sont soit"check","init", ou"add"(par exemple,"check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
Votre tâche consiste à :
- Créer deux variables de type map
map[string]intnomméesscoresetgradessans les initialiser (elles seront nil) - Traiter chaque opération de la chaîne d'entrée de manière séquentielle :
- Pour les opérations
"check":- Vérifier si la map spécifiée est nil
- Afficher
"Map [map_name] is nil"si la map est nil - Afficher
"Map [map_name] is initialized"si la map n'est pas nil
- Pour les opérations
"init":- Initialiser la map spécifiée en utilisant
make(map[string]int) - Afficher
"Initialized map [map_name]"
- Initialiser la map spécifiée en utilisant
- Pour les opérations
"add":- Vérifier d'abord si la map est nil
- Si la map est nil, afficher
"Cannot add to nil map [map_name]" - Si la map n'est pas nil, ajouter la paire clé-valeur et afficher
"Added [key]:[value] to [map_name]"
- Analyser les opérations en découpant la chaîne d'entrée :
- Découper par virgules pour obtenir les opérations individuelles
- Pour chaque opération, découper par deux-points pour obtenir le type d'opération et les paramètres
- Convertir la chaîne de valeur en entier pour les opérations d'ajout
- Après avoir traité toutes les opérations, afficher l'état final des deux maps :
- Pour chaque map, si elle est nil :
"Final state - [map_name]: nil" - Pour chaque map, si elle est initialisée :
"Final state - [map_name]: [count] entries"où count est le nombre de paires clé-valeur
- Pour chaque map, si elle est nil :
Utilisez le package strconv pour convertir les chaînes de valeur en entiers pour les opérations d'ajout. Ce défi démontre comment la vérification des maps nil avant les opérations d'écriture prévient les paniques à l'exécution et rend votre code robuste et fiable.
Aide-mémoire
Une map nil est une map non initialisée qui ne pointe vers rien en mémoire. Tenter d'ajouter des clés à une map nil provoquera un panic et l'arrêt de votre programme.
Déclarer une map sans l'initialiser crée une map nil :
var myMap map[string]int
// myMap est nil à ce stadeLire à partir d'une map nil est sûr (retourne la valeur zéro), mais y écrire provoquera un panic :
// C'est sûr - retourne 0
value := myMap["key"]
// Cela provoquera un panic !
myMap["key"] = 42Vérifiez toujours si une map est nil avant d'ajouter des clés :
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Maintenant, c'est sûrEssayez vous-même
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Lire l'entrée
var numOpsStr string
var operationsStr string
fmt.Scanln(&numOpsStr)
fmt.Scanln(&operationsStr)
// Déclarer les maps sans initialisation (elles seront nil)
var scores map[string]int
var grades map[string]int
// Diviser les opérations par virgule
operations := strings.Split(operationsStr, ",")
// TODO: Écrivez votre code ci-dessous
// Traiter chaque opération séquentiellement
// Gérer les opérations "check", "init" et "add"
// Pour les opérations add, utiliser strconv.Atoi() pour convertir la chaîne de valeur en entier
// Afficher l'état final des deux maps
// Vérifier si les maps sont nil ou initialisées et afficher en conséquence
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements