Wie man einen Slice in Go kopiert
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
- Verwenden Sie die integrierte Funktion
copy
für eine effiziente Slice-Duplizierung. append
kann auch verwendet werden, um eine neue Slice-Kopie zu erstellen.- Beachten Sie flache vs. tiefe Kopien beim Umgang mit Referenztypen.
In Go sind Slices Referenzen auf zugrunde liegende Arrays, was das Kopieren zu einer differenzierten Aufgabe macht. Hier erfahren Sie, wie Sie Slices in Go effektiv kopieren können.
Verwenden der Funktion copy
Go stellt die integrierte Funktion copy
zum Duplizieren von Slices bereit. Diese Funktion kopiert Elemente von einem Quell-Slice in einen Ziel-Slice. So verwenden Sie sie:
package main import "fmt" func main() { // Original-Slice original := []int{1, 2, 3, 4, 5} // Erstellen Sie einen neuen Slice mit der gleichen Länge wie das Original copySlice := make([]int, len(original)) // Kopieren von Elementen vom Original-Slice in den neuen Slice copy(copySlice, original) // Anzeigen des kopierten Slice fmt.Println(copySlice) // Ausgabe: [1 2 3 4 5] }
In diesem Beispiel:
- Wir definieren einen
original
-Slice, der ganze Zahlen enthält. - Wir erstellen einen
copySlice
mit der gleichen Länge wieoriginal
mit der Funktionmake
. - Die Funktion
copy
dupliziert die Elemente vonoriginal
nachcopySlice
.
Kopieren eines Teils eines Slice
Sie können auch eine Teilmenge eines Slice kopieren, indem Sie den gewünschten Bereich angeben:
package main import "fmt" func main() { // Original-Slice original := []int{1, 2, 3, 4, 5} // Erstellen Sie einen neuen Slice, um einen Teil des Originals aufzunehmen copySlice := make([]int, 3) // Kopieren einer Teilmenge des Original-Slice copy(copySlice, original[1:4]) // Anzeigen des kopierten Slice fmt.Println(copySlice) // Ausgabe: [2 3 4] }
Hier kopieren wir Elemente von Index 1 bis 3 (ausschließlich Index 4) des original
-Slice in copySlice
.
Verwenden von Append zum Kopieren eines Slice
Alternativ können Sie die Funktion append
verwenden, um eine Kopie eines Slice zu erstellen:
package main import "fmt" func main() { // Original-Slice original := []int{1, 2, 3, 4, 5} // Kopieren mit Append copySlice := append([]int{}, original...) // Anzeigen des kopierten Slice fmt.Println(copySlice) // Ausgabe: [1 2 3 4 5] }
In diesem Ansatz:
- Wir initialisieren einen leeren Slice
[]int{}
. - Wir verwenden
append
mit dem variadischen Argumentoriginal...
, um alle Elemente vonoriginal
an den neuen Slice anzuhängen.
Wichtige Überlegungen
-
Tiefe Kopie vs. flache Kopie: Die obigen Methoden führen flache Kopien durch, d. h. sie duplizieren die Slice-Struktur, aber nicht die zugrunde liegenden Daten, wenn der Slice Referenzen enthält (z. B. Zeiger, andere Slices). Für tiefe Kopien müssen Sie jedes referenzierte Element manuell kopieren.
-
Kapazität des neuen Slice: Wenn Sie
make
verwenden, um den Ziel-Slice zu erstellen, können Sie auch seine Kapazität angeben. Wenn die Kapazität größer als die Länge ist, kann der neue Slice zusätzliche Elemente aufnehmen, ohne neu zugewiesen zu werden.
Durch das Verständnis dieser Methoden können Sie das Kopieren von Slices in Ihren Go-Programmen effektiv verwalten.
FAQs
Es werden nur so viele Elemente kopiert, wie das Ziel aufnehmen kann.
append
erstellt einen neuen Slice mit einem eigenen Backing Array, während copy
einen vorab zugewiesenen Slice benötigt.
Nein, es werden nur die Elemente kopiert; das Ändern des neuen Slice wirkt sich nicht auf das Original aus.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein Betriebsaufwand – konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ