Golang verstehen: Array vs. Slice
Ethan Miller
Product Engineer · Leapcell

Key Takeaways
- Arrays in Go haben eine feste Größe, während Slices dynamisch und flexibel sind.
- Slices sind Referenztypen, wodurch sie speichereffizienter als Arrays sind.
- Slices bieten leistungsstarke Datenmanipulationsmöglichkeiten, ohne Daten zu kopieren.
In Go sind Arrays und Slices grundlegende Datenstrukturen, die zum Speichern von Elementsequenzen verwendet werden. Obwohl sie ähnlich erscheinen mögen, haben sie unterschiedliche Eigenschaften und Verhaltensweisen, die für Entwickler von entscheidender Bedeutung sind, um sie zu verstehen.
Arrays in Go
Ein Array in Go ist eine Sequenz von Elementen desselben Typs mit fester Größe. Sobald ein Array deklariert ist, kann seine Größe nicht mehr geändert werden. Die Syntax zur Deklaration eines Arrays umfasst die Angabe seiner Größe:
var arr [5]int
In diesem Beispiel ist arr
ein Array von fünf Ganzzahlen. Arrays sind Werttypen in Go, was bedeutet, dass das Zuweisen eines Arrays zu einem anderen alle seine Elemente kopiert. Ebenso führt das Übergeben eines Arrays an eine Funktion dazu, dass das gesamte Array kopiert wird. Dieses Verhalten kann sich auf die Leistung auswirken, insbesondere bei großen Arrays.
Slices in Go
Ein Slice ist eine flexiblere, dynamische Datenstruktur, die ein Fenster in ein zugrunde liegendes Array bietet. Slices besitzen nicht die Daten, auf die sie verweisen; stattdessen beschreiben sie ein Segment eines Arrays. Die Syntax zum Deklarieren eines Slice ist:
var s []int
Slices haben drei Komponenten:
- Zeiger: Verweist auf die Adresse des zugrunde liegenden Arrays.
- Länge: Die Anzahl der Elemente im Slice.
- Kapazität: Die Anzahl der Elemente im zugrunde liegenden Array, beginnend mit dem ersten Element des Slice.
Im Gegensatz zu Arrays sind Slices Referenztypen. Das Zuweisen eines Slice zu einem anderen oder das Übergeben eines Slice an eine Funktion kopiert nicht die zugrunde liegenden Daten; beide Slices beziehen sich auf dasselbe Array-Segment. Dieses Verhalten macht Slices effizienter und vielseitiger für die dynamische Datenmanipulation.
Erstellen von Slices
Slices können auf verschiedene Arten erstellt werden:
-
Aus einem vorhandenen Array oder Slice:
a := [5]int{1, 2, 3, 4, 5} s := a[1:4] // s == []int{2, 3, 4}
-
Mit der Funktion
make
:s := make([]int, 5, 10)
Dies erzeugt einen Slice der Länge 5 und Kapazität 10.
-
Slice-Literale:
s := []int{1, 2, 3}
Dies erzeugt einen Slice mit Länge und Kapazität 3.
Unterschiede zwischen Arrays und Slices
-
Größe: Arrays haben eine feste Größe, die zur Kompilierzeit definiert wird, während Slices dynamisch sind und bei Bedarf wachsen oder schrumpfen können.
-
Typ: Die Größe eines Arrays ist Teil seines Typs (
[3]int
unterscheidet sich von[4]int
), was Arrays weniger flexibel macht. Slices enthalten jedoch keine Größe in ihrem Typ, was die Flexibilität erhöht. -
Speichereffizienz: Slices sind als Referenztypen speichereffizienter, wenn sie an Funktionen übergeben werden, da nur der Slice-Deskriptor (Zeiger, Länge, Kapazität) und nicht die gesamten Daten übergeben werden.
-
Anwendungsfälle: Arrays eignen sich, wenn die Anzahl der Elemente bekannt und festgelegt ist. Slices sind vorzuziehen für dynamische oder unbekannte Anzahlen von Elementen und bieten mehr Flexibilität und Funktionalität.
Interne Mechanismen von Slices
Das Verständnis der internen Mechanismen von Slices ist für eine effiziente Go-Programmierung unerlässlich. Ein Slice ist ein Deskriptor, der einen Zeiger auf das zugrunde liegende Array, seine Länge und seine Kapazität enthält. Wenn ein Slice aus einem Array erstellt wird, verweist er auf ein Segment dieses Arrays:
a := [5]int{1, 2, 3, 4, 5} s := a[1:4]
Hier verweist s
auf die Elemente {2, 3, 4}
des Arrays a
. Das Ändern von s
wirkt sich auf a
aus, da sie dieselben zugrunde liegenden Daten verwenden. Wenn die Kapazität von s
überschritten wird (z. B. mit append
), kann ein neues zugrunde liegendes Array zugewiesen werden, und das ursprüngliche Array bleibt unverändert.
Schlussfolgerung
Arrays und Slices sind grundlegend für die Datenverarbeitungsfunktionen von Go. Arrays bieten eine einfache, feste Sammlung von Elementen, während Slices dynamische, flexible Ansichten in Arrays bieten und eine leistungsstarke Datenmanipulation ohne den Overhead des Kopierens von Daten ermöglichen. Das Verständnis ihrer Unterschiede und geeigneten Anwendungsfälle ist für das Schreiben effizienter und effektiver Go-Programme von entscheidender Bedeutung.
FAQs
Slices bieten dynamische Größenänderung, bessere Speichereffizienz und erweiterte Funktionalität.
Nein, Slices sind Referenztypen, daher verwenden sie dasselbe zugrunde liegende Array.
Ein neues zugrunde liegendes Array wird zugewiesen, und der Slice verweist auf den neuen Speicher.
Wir sind Leapcell, Ihre erste Wahl für das Hosten von Go-Projekten.
Leapcell ist die Serverlose Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Language Support
- 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 US-Dollar 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
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein Betriebsaufwand - konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ