CodeGym /Kurse /Go SELF /Nil slice vs empty slice: Initialisierung und Pruefungen

Nil slice vs empty slice: Initialisierung und Pruefungen

Go SELF
Level 11, Lektion 3
Verfügbar

1. nil-Slice und empty-Slice: worin der Unterschied besteht

Wenn Sie ein Programm in Go schreiben, beginnen Sie sehr schnell damit, Daten als „Liste“ zu speichern: Zahlen, Strings, Eingabewerte, in einer Schleife gesammelte Werte. Und fast sofort taucht die Situation auf: „Die Liste ist leer.“ Aber leer wie genau? Gibt es sie ueberhaupt nicht (nicht initialisiert), oder existiert sie, hat aber 0 Elemente?

In menschlicher Sprache klingt das nach Pedanterie. In der Programmiersprache ist es manchmal ein wichtiger Unterschied: Er beeinflusst Pruefungen, was man vergleichen kann, und wie Ihr Code fuer andere Menschen lesbar ist (einschliesslich Ihres zukuenftigen Ichs, das diesen Code in einem Monat ansehen und denken wird: “Wer hat das geschrieben?”).

Zero Value fuer []T: was ein nil-Slice bedeutet

In Go hat fast jeder Typ einen Standardwert (Zero Value). Fuer int ist das 0, fuer bool — false, fuer string — der leere String "". Fuer einen Slice []T ist der Zero Value nil. Das heisst: „Es gibt keinen Slice“; er zeigt auf keine Elemente.

Die haeufigste Form, in der Sie das sehen, ist eine ganz normale Variablendeklaration:

package main

import "fmt"

func main() {
	var nums []int

	fmt.Println(nums == nil)          // true
	fmt.Println(len(nums), cap(nums)) // 0 0
	fmt.Println(nums)                 // []
}

Achten Sie auf einen kleinen „Streich fuer Anfaenger“: Das Ausgeben von fmt.Println(nums) zeigt []. Auf den ersten Blick sieht das wie eine „leere Liste“ aus. Technisch ist es aber ein nil-Slice.

Merken Sie sich drei Fakten ueber einen nil-Slice:

nums == nil        → true
len(nums)          → 0
cap(nums)          → 0

Warum passt das so gut ins Modell „pointer + len + cap“? Weil pointer = nil ist und Laenge sowie Kapazitaet null sind — es gibt „nichts anzusehen und nichts anzuschauen“.

2. Einfuehrung in make

In Go gibt es zwei auf den ersten Blick aehnliche Woerter — new und make. Am Anfang merkt man sich am besten eins: make verwendet man, um arbeitsbereite Container zu erstellen. Vor allem sind das Slices, Maps und Channels. Heute sind fuer uns nur Slices wichtig.

Wenn Sie schreiben:

tasks := make([]string, 0)

bitten Sie Go: „Erstelle mir einen Slice von Strings mit der Laenge 0.“ Das heisst, es gibt noch keine Elemente, aber das Slice-Objekt existiert bereits und kann sicher uebergeben, aus Funktionen zurueckgegeben und mit append erweitert werden.

Fuer Slices hat make zwei Formen — und beide sind sehr woechentlich woechentlich? No. As German translation.

Fuer Slices hat make zwei Formen — und beide lassen sich ganz woechentlich?

1
Aufgabe
Go SELF, Level 11, Lektion 3
Gesperrt
Drei Profile
Drei Profile
1
Aufgabe
Go SELF, Level 11, Lektion 3
Gesperrt
Leermodus
Leermodus
1
Aufgabe
Go SELF, Level 11, Lektion 3
Gesperrt
Nil-Normalisierung
Nil-Normalisierung
1
Aufgabe
Go SELF, Level 11, Lektion 3
Gesperrt
Erstes Element
Erstes Element
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION