Was ist in Golang der Unterschied zwischen var s []int
und s := make([]int, 0)
?
Ich finde, dass beide funktionieren, aber welches ist besser?
go
allocation
slice
Wang Yi
quelle
quelle
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/1561148Antworten:
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 :Dies bedeutet, dass Sie zum Anhängen an ein Slice nicht zuerst Speicher zuweisen müssen: Das
nil
Slicep int[]
reicht als Slice zum Hinzufügen aus.quelle
var p []int
einfach einfacher als die Verwendungmake
(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
weist keinen Speicher zu und
s
zeigt aufnil
, währendOrdnet 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.
quelle
make
Karten erstellen, da selbst ein leerermap
Speicherplatz für die Buchhaltung benötigt wird.nil
falls Ihr Slice kein Element und kein leeres Array enthält. Wennmake
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 produzierennull
, während das Marshalling der leeren Slice (s := make([]int, 0)
) die erwarteten[]
Habe gerade einen Unterschied gefunden. Wenn du benutzt
und dann codieren Sie die Ausgabe als JSON, erhalten Sie
null
.Ergebnisse
[]
wie erwartet.quelle
Ein bisschen vollständiger (ein weiteres Argument in
make
) Beispiel:Aus:
Oder mit dynamischer Art von
slice
:Aus:
quelle