Die Funktion copy(dst, src []T) int kopiert die Elemente von src nach dst.
min(len(dst), len(src)).src[i] werden in dst[i] kopiert.Besonderheiten und Einschränkungen:
dst eine kleinere Länge hat als src, werden nur so viele Daten kopiert, wie die Länge von dst zulässt.dst eine größere Kapazität als Länge hat, erweitert copy das Slice nicht? — Nein, nur die len(dst) wird als Zieltiefe betrachtet. Zum Erweitern verwenden Sie vorher append.Beispiel:
a := []int{1,2,3,4,5} b := make([]int, 3) copy(b, a) // b: [1 2 3]
Überlappung:
x := []int{1,2,3,4} copy(x[1:], x[:3]) // [1 1 2 3]
Kann copy() verwendet werden, um die Länge eines Slices zu erhöhen? Was passiert, wenn ein Slice-Ziel mit größerer Kapazität, aber kleinerer Länge als erforderlich, an copy übergeben wird?
Antwort:
dst eine Kapazität hat, die größer ist als die Länge, erweitern Sie es zuerst mit dst = dst[:newLen], dann verwenden Sie copy()Beispiel, oft nicht offensichtlich:
a := []int{1,2,3} b := make([]int, 0, 5) copy(b, a) // b bleibt leer, da len(b)==0 b = b[:len(a)] copy(b, a) // jetzt b: [1,2,3]
Geschichte
Im Projekt wurden Daten von einem Slice in einen anderen kopiert, in der Annahme, dass copy die Länge von dst automatisch auf das Notwendige erweitert. Das geschah nicht, die Elemente wurden nicht kopiert, was dazu führte, dass die API mit Null-Werten antwortete. Der Fehler wurde erst nach dem Vergleich der Längen der Slices gefunden — das Problem war, dass
dsteine große Kapazität hatte, aber die Länge gleich 0 war.
Geschichte
Ein Teil des Mikrodienstes arbeitete mit sich überlappenden Slices und erwartete fälschlicherweise, dass copy immer korrekt funktioniert. Dadurch wurden die ursprünglichen Daten beim Vorwärtskopieren zerstört, und es traten "unsichtbare" Bugs beim Arbeiten mit Puffer auf. Das Problem wurde durch die Verwendung eines temporären Puffers gelöst (copy(tmp, src), dann copy(dst, tmp)).
Geschichte
Ein Ingenieur optimierte ein Array, indem er copy verwendete, um Daten zwischen Slices zu sortieren. Er erwartete, dass copy die Länge von dst korrigiert. Es stellte sich heraus, dass dies nicht geschah und es zu Panik und Überläufen von signifikanten Daten kam — vergessen wurde, die Länge des Slices vor dem Kopieren korrekt zu ändern.