Antworten:
Neben fabriziom ‚s Antwort , können Sie weitere Beispiele zu‚sehen : Nutzung und Interna Go Slices , wo eine Verwendung für‘ []int
erwähnt wird :
Da sich der Nullwert eines Slice (
nil
) wie ein Slice mit der Länge Null verhält , können Sie eine Slice-Variable deklarieren und dann in einer Schleife an sie anhängen:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
Dies bedeutet, dass Sie zum Anhängen an ein Slice nicht zuerst Speicher zuweisen müssen: Das nil
Slice p int[]
reicht als Slice zum Hinzufügen aus.
var p []int
einfach einfacher als die Verwendung make
(was ich eher mit der Zuweisung verbinde, obwohl sie mit einer Obergrenze von 0 nichts zuordnen würde). In Bezug auf die Lesbarkeit bevorzuge ich es, make
hier nicht zu verwenden .
p := []int{}
). Da wir normalerweise die :=
Syntax verwenden, um die meisten Variablen zu deklarieren, ist es natürlicher, sie überall zu haben, anstatt Ausnahmen für Slices zu haben. Abgesehen davon treiben Versuche, an Zuordnungen zu denken, die Leute normalerweise zu vorzeitigen Optimierungen.
Einfache Erklärung
var s []int
weist keinen Speicher zu und s
zeigt auf nil
, während
s := make([]int, 0)
Ordnet Speicher zu und s
zeigt auf Speicher auf ein Slice mit 0 Elementen.
Normalerweise ist der erste idiomatischer, wenn Sie die genaue Größe Ihres Anwendungsfalls nicht kennen.
make
Karten erstellen, da selbst ein leerer map
Speicherplatz für die Buchhaltung benötigt wird.
nil
falls Ihr Slice kein Element und kein leeres Array enthält. Wenn make
jedoch zum Erstellen des Slice verwendet wird, wird stattdessen ein leeres Array zurückgegeben, was im Allgemeinen der gewünschte Effekt ist.
var s []int
) wird produzieren null
, während das Marshalling der leeren Slice ( s := make([]int, 0)
) die erwarteten[]
Habe gerade einen Unterschied gefunden. Wenn du benutzt
var list []MyObjects
und dann codieren Sie die Ausgabe als JSON, erhalten Sie null
.
list := make([]MyObjects, 0)
Ergebnisse []
wie erwartet.
Ein bisschen vollständiger (ein weiteres Argument in make
) Beispiel:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Aus:
length: 2 - capacity 5 - content: [0 0]
Oder mit dynamischer Art von slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Aus:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
Slice, während der zweite einempty
Slice erstellt (dies ist die Terminologie, die im "Go in Action Book" verwendet wird ). Um zu vermeiden, dass die gleiche Antwort auch hier veröffentlicht wird, können Sie stackoverflow.com/a/45997533/1561148