Menu
Coddy logo textTech

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 stade

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

Pour é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ûr

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

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

challenge icon

Défi

Facile

Cré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 à :

  1. Créer deux variables de type map map[string]int nommées scores et grades sans les initialiser (elles seront nil)
  2. Traiter chaque opération de la chaîne d'entrée de manière séquentielle :
  3. 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
  4. Pour les opérations "init" :
    • Initialiser la map spécifiée en utilisant make(map[string]int)
    • Afficher "Initialized map [map_name]"
  5. 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]"
  6. 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
  7. 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

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 stade

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

Vé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ûr

Essayez 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
}
quiz iconTestez-vous

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