Ich muss eine Kopie eines Slice in Go erstellen und beim Lesen der Dokumente steht mir eine Kopierfunktion zur Verfügung.
Die integrierte Funktion zum Kopieren kopiert Elemente aus einem Quell-Slice in ein Ziel-Slice. (Als Sonderfall werden auch Bytes aus einer Zeichenfolge in ein Byte-Slice kopiert.) Quelle und Ziel können sich überschneiden. Kopieren gibt die Anzahl der kopierten Elemente zurück, dh das Minimum von len (src) und len (dst).
Aber wenn ich es mache:
arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)
Mein tmp
ist leer wie vorher (ich habe sogar versucht es zu benutzen arr, tmp
):
[]
[1 2 3]
Sie können es auf dem Spielplatz überprüfen . Warum kann ich ein Slice nicht kopieren?
dst
sollte aber mindestens so groß sein wie viele Elemente, die Sie kopieren möchten (für eine vollständige Kopiesrc
bedeutet dieslen(dst) >= len(src)
).b := append([]int{}, a...)
Antworten:
Die eingebauten
copy(dst, src)
Kopienmin(len(dst), len(src))
Elemente.Wenn Ihr
dst
also leer ist (len(dst) == 0
), wird nichts kopiert.Versuchen Sie
tmp := make([]int, len(arr))
( Go Playground ):Ausgabe (wie erwartet):
Leider ist dies nicht im
builtin
Paket dokumentiert , aber es ist in der Go-Sprachspezifikation dokumentiert : Anhängen an und Kopieren von Slices :Bearbeiten:
Schließlich wurde die Dokumentation von
copy()
aktualisiert und enthält nun die Tatsache, dass die Mindestlänge von Quelle und Ziel kopiert wird:quelle
copy
lässt sich sagen, dass es keine Logik zum Vergrößern des Ziel-Slice enthält, wenn das Ziel-Slice zu klein ist. Es gibt jedoch eine weitere integrierte Funktion, die Folgendes bewirkt:append
In diesem Beispiel ist es besser, zunächst nur das Slice mit der richtigen Größe zuzuweisen.append
Kann verwendet werden, wenn Sie bereits ein Slice haben und es vergrößern möchten, indem Sie am Ende Elemente hinzufügen.Eine andere einfache Möglichkeit, dies zu tun, besteht darin,
append
das Slice im Prozess zuzuweisen.Ausgabe (wie erwartet):
Eine Abkürzung zum Kopieren von Arrays
arr
wäre alsoappend([]int(nil), arr...)
https://play.golang.org/p/sr_4ofs5GW
quelle
Wenn Ihre Scheiben die gleiche Größe hätten, würde es funktionieren :
Würde geben:
Aus " Go Slices: Verwendung und Interna ":
Das übliche Beispiel ist:
quelle
Die copy () wird für die kleinste Länge von dst und src ausgeführt, daher müssen Sie die dst auf die gewünschte Länge initialisieren.
Ausgabe:
Sie können alle Elemente in einer Zeile mit append () initialisieren und in ein Null-Slice kopieren.
Beispiel:
Ausgabe:
Verwenden Sie im Vergleich zu Zuordnung + Kopie () für mehr als 1.000 Elemente Anhängen. Unter 1000 kann der Unterschied vernachlässigt werden. Machen Sie es zur Faustregel, es sei denn, Sie haben viele Scheiben.
quelle
tmp
braucht genug Platz fürarr
. Beispielsweise,Ausgabe:
quelle
Hier ist eine Möglichkeit, ein Slice zu kopieren. Ich bin etwas spät dran, aber es gibt eine einfachere und schnellere Antwort als bei @ Dave. Dies sind die Anweisungen, die aus einem Code wie @ Dave's generiert wurden. Dies sind die Anweisungen, die von mir generiert wurden. Wie Sie sehen, gibt es weit weniger Anweisungen. Was ist, ist, dass es nur tut
append(slice)
, was das Slice kopiert. Dieser Code:Gibt dies aus:
quelle