Oder genauer, es scheint, als könnte ich eines dieser drei Dinge tun. Gibt es einen Unterschied zwischen ihnen? Welches ist das Beste und warum?Wie soll ich ein leeres Slice in Go definieren?
var foo []int
foo := []int{}
foo := make([]int, 0)
Oder genauer, es scheint, als könnte ich eines dieser drei Dinge tun. Gibt es einen Unterschied zwischen ihnen? Welches ist das Beste und warum?Wie soll ich ein leeres Slice in Go definieren?
var foo []int
foo := []int{}
foo := make([]int, 0)
1) ist ein nil slice.
2) und 3) sind Nicht-Nil-Scheiben mit der Länge Null und der Kapazität Null.
Keine der Optionen Speicher zuordnen.
Alle Optionen werden häufig in Go-Code verwendet.
Da len
, cap
und append
mit Nil-Scheiben arbeiten, 1) kann oft austauschbar mit 2) und 3) verwendet werden.
Sind Sie sicher, dass 2 und 3 nicht zuordnen? Dies zeigt sich anders (RES oben überprüfen): http://play.golang.org/p/105KU6MsD3 es 244 MB verwendet, aber wenn Sie die for-Schleife auskommentieren, ist es 15 MB. EDIT: vergiss es. runtime.MemStats zeigt die Zuweisung bei make ([] [] int), aber keine Zuordnungen mehr in der Schleife, ich nehme an, dass nicht darauf zugegriffen wird, so dass sie nicht tatsächlich zugewiesen, sondern einfach reserviert ist. – siritinga
Anrufe tätigen [mallocgc] (https://github.com/golang/go/blob/d5e4c4061b019a36ed3ac954c98f6535b7e78189/src/runtime/malloc.go#L45), um das Backing-Array für das Segment zuzuweisen. Mallocgc gibt einen Zeiger auf einen festen Block zurück, wenn Größe == 0 ist. –