Prüfen auf Nil-Maps
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 28 von 68.
In Go kann eine Map einen speziellen Zustand namens nil haben. Eine nil-Map ist im Wesentlichen eine nicht initialisierte Map, die auf nichts im Speicher zeigt. Dieses Konzept zu verstehen ist entscheidend, da der Versuch, Schlüssel zu einer nil-Map hinzuzufügen, dazu führt, dass Ihr Programm einen Panic-Zustand auslöst und abstürzt.
So entsteht eine nil Map und so sieht sie aus:
var myMap map[string]int
// myMap ist an dieser Stelle nilWenn Sie eine Map-Variable deklarieren, ohne sie zu initialisieren, setzt Go sie automatisch auf nil. Während Sie sicher aus einer nil-Map lesen können (sie gibt den Nullwert zurück), verursacht der Versuch, in sie zu schreiben, eine Panic:
// Dies ist sicher - gibt 0 zurück
value := myMap["key"]
// Dies wird eine Panic verursachen!
myMap["key"] = 42Um dieses Problem zu vermeiden, sollten Sie immer prüfen, ob eine Map nil ist, bevor Sie versuchen, Schlüssel zu ihr hinzuzufügen. Die Prüfung ist unkompliziert:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Jetzt ist dies sicherDiese einfache Prüfung stellt sicher, dass Ihr Programm nicht abstürzt, wenn Sie mit potenziell nicht initialisierten Maps arbeiten, wodurch Ihr Code robuster und zuverlässiger wird.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachErstellen Sie ein sicheres Map-Initialisierungssystem, das Panic-Fehler verhindert, indem es vor Schreibvorgängen auf nil-Maps prüft. Diese Herausforderung demonstriert die entscheidende Bedeutung der Validierung des Map-Status, bevor Operationen durchgeführt werden, die Ihr Programm zum Absturz bringen könnten.
Sie erhalten zwei Eingaben:
- Einen String, der die Anzahl der Operationen darstellt (z. B.
"5") - Einen String, der Operationen im Format
"operation1:key1:value1,operation2:key2:value2"enthält, wobei die Operationen entweder"check","init"oder"add"sind (z. B."check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
Ihre Aufgabe ist es:
- Erstellen Sie zwei Map-Variablen vom Typ
map[string]intnamensscoresundgrades, ohne sie zu initialisieren (sie werden nil sein) - Verarbeiten Sie jede Operation aus dem Eingabestring nacheinander:
- Für
"check"Operationen:- Prüfen Sie, ob die angegebene Map nil ist
- Geben Sie
"Map [map_name] is nil"aus, wenn die Map nil ist - Geben Sie
"Map [map_name] is initialized"aus, wenn die Map nicht nil ist
- Für
"init"Operationen:- Initialisieren Sie die angegebene Map mit
make(map[string]int) - Geben Sie
"Initialized map [map_name]"aus
- Initialisieren Sie die angegebene Map mit
- Für
"add"Operationen:- Prüfen Sie zuerst, ob die Map nil ist
- Wenn die Map nil ist, geben Sie
"Cannot add to nil map [map_name]"aus - Wenn die Map nicht nil ist, fügen Sie das Key-Value-Paar hinzu und geben Sie
"Added [key]:[value] to [map_name]"aus
- Parsen Sie die Operationen, indem Sie den Eingabestring aufteilen:
- Teilen Sie nach Kommas auf, um einzelne Operationen zu erhalten
- Teilen Sie für jede Operation nach Doppelpunkten auf, um den Operationstyp und die Parameter zu erhalten
- Konvertieren Sie den Value-String für Add-Operationen in einen Integer
- Zeigen Sie nach der Verarbeitung aller Operationen den Endzustand beider Maps an:
- Für jede Map, wenn sie nil ist:
"Final state - [map_name]: nil" - Für jede Map, wenn sie initialisiert ist:
"Final state - [map_name]: [count] entries"wobei count die Anzahl der Key-Value-Paare ist
- Für jede Map, wenn sie nil ist:
Verwenden Sie das strconv Paket, um Value-Strings für Add-Operationen in Integer zu konvertieren. Diese Herausforderung zeigt, wie das Prüfen auf nil-Maps vor Schreibvorgängen Runtime-Panics verhindert und Ihren Code robust und zuverlässig macht.
Spickzettel
Eine nil-Map ist eine nicht initialisierte Map, die auf nichts im Speicher zeigt. Der Versuch, Schlüssel zu einer nil-Map hinzuzufügen, führt dazu, dass Ihr Programm in Panik gerät (panic) und abstürzt.
Das Deklarieren einer Map ohne Initialisierung erstellt eine nil-Map:
var myMap map[string]int
// myMap is nil at this pointDas Lesen aus einer nil-Map ist sicher (gibt den Nullwert zurück), aber das Schreiben in sie führt zu einer Panic:
// This is safe - returns 0
value := myMap["key"]
// This will panic!
myMap["key"] = 42Prüfen Sie immer, ob eine Map nil ist, bevor Sie Schlüssel hinzufügen:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Now this is safeProbier es selbst
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Eingabe lesen
var numOpsStr string
var operationsStr string
fmt.Scanln(&numOpsStr)
fmt.Scanln(&operationsStr)
// Maps ohne Initialisierung deklarieren (sie werden nil sein)
var scores map[string]int
var grades map[string]int
// Operationen durch Komma trennen
operations := strings.Split(operationsStr, ",")
// TODO: Schreiben Sie Ihren Code unten
// Jede Operation nacheinander verarbeiten
// "check", "init" und "add" Operationen behandeln
// Für add-Operationen strconv.Atoi() verwenden, um den Wert-String in eine Ganzzahl umzuwandeln
// Endzustand beider Maps ausgeben
// Prüfen, ob Maps nil oder initialisiert sind und entsprechend ausgeben
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten