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?
GO TO FULL VERSION