Sie sagen "nicht feste Größe", aber Slices haben niemals eine feste Größe. Es sei denn, Sie meinen mit null Kapazität. Hinweis: Wenn Sie eine Idee / Vermutung / einen Hinweis darauf haben, welche Kapazität Sie möglicherweise benötigen, ist die Verwendung der Version mit drei Argumenten gut. ZB um ein Stück Kartenschlüssel zu bauen:keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Die beiden von Ihnen angegebenen Alternativen sind semantisch identisch. Die Verwendung make([]int, 0)führt jedoch zu einem internen Aufruf von runtime.makeslice (Go 1.14).
Sie haben auch die Möglichkeit, einen nilWert zu hinterlassen :
Ein Null-Slice entspricht funktional einem Slice mit der Länge Null, obwohl es auf nichts zeigt. Es hat die Länge Null und kann mit Zuordnung angehängt werden.
Ein nilSlice wird jedoch json.Marshal()in, "null"während ein leeres Slice in "[]", wie von @farwayer hervorgehoben.
Keine der oben genannten Optionen führt zu einer Zuweisung, wie von @ArmanOrdookhani hervorgehoben.
Seien Sie json.Marshal()nullvar myslice []int[]myslice := []int{}
vorsichtig
10
Auch Vorsicht: reflect.DeepEqualmacht eine Unterscheidung zwischen null Scheiben und Nicht-Null - Scheiben: a := []int{}, var b []int,reflect.DeepEqual(a, b) // returns false
asgaines
1
Warum denkst du, würde es eine Allokation machen? Die Obergrenze ist Null, daher wird nichts zugewiesen. Alle Zeiger auf Dinge mit der Länge Null zeigen auf dieselbe Stelle im Speicher: play.golang.org/p/MPOKKl_sYvw
Arman Ordookhani
1
@ArmanOrdookhani Du bist richtig. Ich habe es ausprobiert und festgestellt, dass ich mit meiner Annahme einer identischen Montageanleitung falsch lag. Fest!
Beide Slices haben eine 0Kapazität, was bedeutet, dass beide Slices eine Kapazität haben0 Länge haben (kann nicht größer als die Kapazität sein), was bedeutet, dass beide Slices keine Elemente haben. Dies bedeutet, dass die 2 Scheiben in jeder Hinsicht identisch sind.
Im Folgenden finden Sie einige Informationen aus dem Buch "Go in Action" , die meiner Meinung nach erwähnenswert sind:
Unterschied zwischen nil& emptyScheiben
Wenn wir an eine Scheibe wie diese denken:
[pointer][length][capacity]
dann:
nil slice:[nil][0][0]
empty slice:[addr][0][0]// points to an address
keine Scheibe
Sie sind nützlich, wenn Sie ein nicht vorhandenes Slice darstellen möchten, z. B. wenn in einer Funktion, die ein Slice zurückgibt, eine Ausnahme auftritt.
// Create a nil slice of integers.var slice []int
leere Scheibe
Leere Slices sind nützlich, wenn Sie eine leere Sammlung darstellen möchten, z. B. wenn eine Datenbankabfrage keine Ergebnisse zurückgibt.
// Use make to create an empty slice of integers.
slice := make([]int,0)// Use a slice literal to create an empty slice of integers.
slice :=[]int{}
Unabhängig davon , ob Sie eine Null Scheibe oder eine leere Scheibe verwendet, die integrierten Funktionen append, lenund capArbeit gleich.
Können wir die Adresse des leeren Slice in einem Schritt mit abrufen make?
Simin Jie
Wenn wir einen Blick auf die Funktion übernehmen Signatur , makescheint nicht die Adresse zurückzukehren. Ich glaube, Sie können es nicht in einem Schritt tun.
Tgogos
13
Leeres Slice und Null-Slice werden in Go unterschiedlich initialisiert:
make([]int, 0)ist das Beste, weil Jetbrains GoLand sich nicht darüber beschwert, dass es "unnötig" ist, wie es im Fall von der Fall ist []int{}. Dies ist nützlich beim Schreiben von Komponententests.
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Antworten:
Die beiden von Ihnen angegebenen Alternativen sind semantisch identisch. Die Verwendung
make([]int, 0)
führt jedoch zu einem internen Aufruf von runtime.makeslice (Go 1.14).Sie haben auch die Möglichkeit, einen
nil
Wert zu hinterlassen :Wie im Golang.org-Blog geschrieben :
Ein
nil
Slice wird jedochjson.Marshal()
in,"null"
während ein leeres Slice in"[]"
, wie von @farwayer hervorgehoben.Keine der oben genannten Optionen führt zu einer Zuweisung, wie von @ArmanOrdookhani hervorgehoben.
quelle
json.Marshal()
null
var myslice []int
[]
myslice := []int{}
reflect.DeepEqual
macht eine Unterscheidung zwischen null Scheiben und Nicht-Null - Scheiben:a := []int{}
,var b []int
,reflect.DeepEqual(a, b) // returns false
Sie sind gleichwertig. Siehe diesen Code:
Ausgabe:
Beide Slices haben eine
0
Kapazität, was bedeutet, dass beide Slices eine Kapazität haben0
Länge haben (kann nicht größer als die Kapazität sein), was bedeutet, dass beide Slices keine Elemente haben. Dies bedeutet, dass die 2 Scheiben in jeder Hinsicht identisch sind.Siehe ähnliche Fragen:
Was bringt es, in Golang keine Scheibe und keine leere Scheibe zu haben?
Null-Scheiben gegen Nicht-Null-Scheiben gegen leere Scheiben in der Go-Sprache
quelle
Als Ergänzung zu @ANisus ' Antwort ...
Im Folgenden finden Sie einige Informationen aus dem Buch "Go in Action" , die meiner Meinung nach erwähnenswert sind:
Unterschied zwischen
nil
&empty
ScheibenWenn wir an eine Scheibe wie diese denken:
dann:
Beispiel für einen Spielplatz :
Drucke:
quelle
make
?make
scheint nicht die Adresse zurückzukehren. Ich glaube, Sie können es nicht in einem Schritt tun.Leeres Slice und Null-Slice werden in Go unterschiedlich initialisiert:
Wie bei allen drei Scheiben sind len und cap 0.
quelle
make([]int, 0)
ist das Beste, weil Jetbrains GoLand sich nicht darüber beschwert, dass es "unnötig" ist, wie es im Fall von der Fall ist[]int{}
. Dies ist nützlich beim Schreiben von Komponententests.