„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Go Basics: Warum Nil-Slices neue Werte akzeptieren, Nil-Maps jedoch nicht

Go Basics: Warum Nil-Slices neue Werte akzeptieren, Nil-Maps jedoch nicht

Veröffentlicht am 01.11.2024
Durchsuche:367

Neue Werte können zu Nil Slice hinzugefügt werden, aber das Hinzufügen neuer Werte zu Nil Map führt zu einem Laufzeitfehler. Mal sehen warum

var slice []int // nil slice
slice = append(slice, 1) // append works as expected
fmt.Println(slice) // [1]

var m map[string]int // nil map
m["one"] = 1 // ? Runtime panic: assignment to entry in nil map

Warum das Anhängen an ein Nil-Slice funktioniert:
Slice ist ein Verweis auf ein zugrunde liegendes Array und eine Datenstruktur mit dynamischer Größe. Es besteht aus 3 Komponenten

  • Zeiger auf zugrunde liegendes Array
  • Länge des Slice
  • Kapazität des Slice

Wenn wir ein Null-Slice deklarieren, sind Länge und Kapazität Null und es zeigt nicht auf ein zugrunde liegendes Array. Grundsätzlich überprüft der Anhängevorgang die Kapazität. Wenn diese nicht ausreicht, weist er ein neues zugrunde liegendes Array mit ausreichend Kapazität zum Speichern der neuen Elemente zu und gibt einen neuen Slice zurück, der auf das neu erstellte Array verweist. Das Anhängen funktioniert also wie erwartet.

Warum das Hinzufügen zu einer Nil-Karte nicht funktioniert:
Map in Golang fungiert im Wesentlichen als Hash-Tabelle und die internen Datenstrukturen müssen zuerst initialisiert werden, bevor wir das Schlüssel-Wert-Paar speichern können.

Wenn wir eine Karte als Null deklarieren (var m map[string]int), ist sie nicht initialisiert und noch nicht bereit, Schlüssel-Wert-Paare zu speichern. Dies führt also zu einem Laufzeitfehler, wenn wir versuchen, Werte zu einer Null-Map hinzuzufügen. Um solche Fehler zu vermeiden, erstellen Sie eine Karte mit make

var m map[string]int // nil map

m = make(map[string]int) // initialize it
m["one"] = 1 // map is now initialized, so we can add values
print(m) // map[one:1]

  • Unterstützt Go Pass By Ref?
  • Neu vs. Make in Go
  • Unterstützt Go die Vererbung?
  • Wie erstelle ich einen einfachen Webserver in Go?

Um mehr über solche Themen sowie Codebeispiele zu erfahren, schauen Sie sich gerne mein Github-Repo an:

Go Basics: Why nil Slices accept new values, but nil Maps don Sai7xp / lernen-golang

GoLang-Grundlagen bis Fortgeschrittene. Einschließlich Designmuster, SOLID-Prinzipien und mehr

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/sai7xp/go-basics-why-nil-slices-accept-new-values-but-nil-maps-dont-23l0?1 Wenn es einen Verstoß gibt, bitte Kontaktieren Sie Study_golang@163 .comdelete
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3