Was ist in Golang der Unterschied zwischen var s []int
Und s := make([]int, 0)
?
Ich finde, dass beides funktioniert, aber welches ist besser?
Zusätzlich zu fabriziom 's answer finden Sie weitere Beispiele unter " Go Slices: usage and internals ", wo eine Verwendung für []int
wird genannt:
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 anhängen dazu in einer Schleife:
// 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.
Einfache Erklärung
var s []int
reserviert keinen Speicher und s
zeigt auf nil
, während
s := make([]int, 0)
weist einem Slice mit 0 Elementen Speicher zu und s
verweist auf den Speicher.
Normalerweise ist die erste Variante idiomatischer, wenn Sie die genaue Größe Ihres Anwendungsfalls nicht kennen.
Fand gerade einen Unterschied. Wenn du benutzt
var list []MyObjects
wenn Sie die Ausgabe als JSON kodieren, erhalten Sie null
.
list := make([]MyObjects, 0)
ergebnisse in []
wie erwartet.
Ein bisschen vollständiger (ein weiteres Argument in make
) Beispiel:
slice := make([]int, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Aus:
lenght: 2 - capacity 5 - content: [0 0]
Oder mit dynamischem Typ von slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Aus:
lenght: 2 - capacity 5 - content: [<nil> <nil>]