Heim >Backend-Entwicklung >Golang >Wie kann ich ein Slice in Go tief kopieren: Anhängen oder Kopieren?

Wie kann ich ein Slice in Go tief kopieren: Anhängen oder Kopieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-01 03:44:10674Durchsuche

How to Deep Copy a Slice in Go: Append vs. Copy?

So kopieren Sie ein Slice in Go präzise und effizient tief

In Go erfordert das Kopieren von Slices Überlegungen zur Erstellung eines neuen Backing-Arrays, um unbeabsichtigte Änderungen am ursprünglichen Array zu verhindern . Es gibt mehrere übersichtliche und leistungsstarke Möglichkeiten, dies zu erreichen.

Ein Ansatz ist die Verwendung der Append-Funktion:

copy := append([]T{}, orig...)

wobei T der Elementtyp des ursprünglichen Slice-Origins ist. Es gibt jedoch eine alternative Lösung mit der integrierten Kopierfunktion:

cpy := make([]T, len(orig))
copy(cpy, orig)

Die Kopierfunktion ist für das Kopieren von Slices innerhalb der Sprache optimiert. Aus der Go-Dokumentation:

"Die integrierte Kopierfunktion kopiert Elemente von einem Quell-Slice in ein Ziel-Slice. ... Copy gibt die Anzahl der kopierten Elemente zurück, was dem Minimum von len(src) entspricht. und len(dst)."

Hinweis:

Es ist wichtig zu bedenken, dass diese Lösungen Werte im Slice kopieren. Wenn das Slice Zeiger oder Strukturen mit Zeigerfeldern enthält, zeigen diese Zeiger immer noch auf die gleichen Werte wie das ursprüngliche Slice.

Benchmark:

Testen des Anhängens und Kopierens Ansätze zeigen ähnliche Leistungsmerkmale:

BenchmarkCopy     100000         24724 ns/op
BenchmarkAppend   100000         24967 ns/op

Die Benchmark-Ergebnisse legen nahe, dass beide Methoden für Deep Copying gleichermaßen effizient sind Scheiben.

Das obige ist der detaillierte Inhalt vonWie kann ich ein Slice in Go tief kopieren: Anhängen oder Kopieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn