Heim > Backend-Entwicklung > Golang > Warum stimmt die Kapazität eines neu geschnittenen Go-Slices nicht mit der Kapazität des ursprünglichen Slice überein?

Warum stimmt die Kapazität eines neu geschnittenen Go-Slices nicht mit der Kapazität des ursprünglichen Slice überein?

DDD
Freigeben: 2024-12-27 15:44:10
Original
570 Leute haben es durchsucht

Why Doesn't the Capacity of a Re-sliced Go Slice Match the Original Slice's Capacity?

Slices in Golang neu aufteilen: Die Dynamik des Slicings verstehen

Im Bereich der Go-Programmierung ist das Aufteilen von Arrays und Slices ein grundlegendes Konzept. Allerdings kann es für Anfänger verwirrend sein, auf Feinheiten zu stoßen, wie sie im bereitgestellten Code hervorgehoben sind. Lassen Sie uns die Verwirrung rund um die Kapazität eines neu segmentierten Slice aufklären.

Der Beispielcode demonstriert den Prozess der Erstellung von Slices aus einem Array und des anschließenden erneuten Slicens eines dieser Slices. Es wirft jedoch einen Streitpunkt auf: Warum stimmt die Kapazität des neu segmentierten Slice nicht mit der tatsächlichen Kapazität des Slice überein, von dem es abgeleitet ist?

Um dies zu verstehen, müssen wir uns mit den Interna befassen Schneiden in Golang. Wenn ein Slice aus einem Array erstellt wird, stellt es im Wesentlichen ein Fenster in dieses Array bereit. Es wird keine separate Kopie der Elemente erstellt. es verweist lediglich auf das zugrunde liegende Array. Die Länge des Slice stellt die Anzahl der Elemente dar, die es derzeit umfasst, während seine Kapazität die maximale Anzahl von Elementen angibt, die es potenziell enthalten kann.

Die Kapazität des ursprünglichen Slice (in diesem Fall b) wird bestimmt nach der Größe des Arrays, aus dem es erstellt wurde. Wenn jedoch ein erneutes Slice durchgeführt wird (z. B. das Erstellen von c aus b), wird die Länge des neuen Slice (c) basierend auf den bereitgestellten Indizes angepasst, die Kapazität bleibt jedoch gleich. Dies liegt daran, dass das neu segmentierte Slice immer noch dasselbe zugrunde liegende Array wie das ursprüngliche Slice nutzt.

Mit anderen Worten: Die Kapazität eines neu segmentierten Slice ist immer die Kapazität des ursprünglichen Slice minus dem Startindex von die neu geschnittene Scheibe. Im bereitgestellten Beispiel hat b eine Kapazität von 5. Da c ab dem 0. Index neu aufgeteilt wird, beträgt seine Kapazität 5 - 0 = 5. Dies erklärt, warum c eine Kapazität von 5 hat, obwohl es nur eine Länge von 2 hat.

Um dies weiter zu veranschaulichen, modifizieren wir den Beispielcode leicht:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
Nach dem Login kopieren

In diesem modifizierten Code ist d ein neu segmentiertes Stück von b Das beginnt bei Index 1 und geht bis Index 5. Wenn wir d ändern, indem wir seinem ersten Element den Wert 1 zuweisen, ist es interessant zu beobachten, dass auch c betroffen ist. Dies liegt daran, dass sowohl c als auch d lediglich unterschiedliche Fenster in demselben zugrunde liegenden Array b sind.

Das obige ist der detaillierte Inhalt vonWarum stimmt die Kapazität eines neu geschnittenen Go-Slices nicht mit der Kapazität des ursprünglichen Slice überein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage