Heim >Backend-Entwicklung >Golang >Wie verhält sich das erneute Schneiden mit zugrunde liegenden Arrays in Go-Slices?

Wie verhält sich das erneute Schneiden mit zugrunde liegenden Arrays in Go-Slices?

Susan Sarandon
Susan SarandonOriginal
2024-12-26 19:02:10517Durchsuche

How Does Re-slicing Behave with Underlying Arrays in Go Slices?

Slices in Go neu aufteilen: Verwirrung und Klarheit

In Go sind Slices eine leistungsstarke und effiziente Möglichkeit, Datenarrays darzustellen. Allerdings kann es für Anfänger eine Herausforderung sein, ihre Feinheiten zu verstehen. Ein solcher Aspekt ist das Konzept des erneuten Schneidens von Slices.

Bedenken Sie den folgenden Code:

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}

Das Programm erstellt vier Slices: a, b, c und d. Das überraschende Ergebnis ist, dass Slice c, das als Slice der ersten beiden Elemente von b erstellt wurde, eine Kapazität von 5 statt 2 hat.

Um dieses Verhalten zu verstehen, müssen wir uns mit dem Konzept der zugrunde liegenden Arrays befassen . In Go speichern Slices nicht die eigentlichen Daten; Vielmehr verweisen sie auf ein zugrunde liegendes Array. Wenn ein Slice erstellt wird, zeigt es auf ein Segment dieses zugrunde liegenden Arrays.

Wenn im obigen Beispiel b mit einer Länge von 0, aber einer Kapazität von 5 erstellt wird, reserviert es 5 Slots in einem zugrunde liegenden Array . Wenn Slice c aus b erstellt wird, wird es zu einem Fenster über den ersten beiden Elementen von b. Das zugrunde liegende Array und damit die Kapazität von c bleibt jedoch 5, was die ungenutzten Slots in b einschließt.

Dieses Konzept des Re-Slicings wird durch eine leichte Modifikation des Codes weiter veranschaulicht:

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

In diesem Fall ändert die Änderung des Werts von d auch den Wert von c, was zeigt, dass c und d nur unterschiedliche Fenster über demselben zugrunde liegenden Array sind.

Verständnis Das Konzept des erneuten Slicings ist entscheidend für die effektive Arbeit mit Slices in Go. Sie können damit Slices erstellen, die sich dynamisch an unterschiedliche Datengrößen anpassen, ohne dass Speicher kopiert oder neu zugewiesen werden muss.

Das obige ist der detaillierte Inhalt vonWie verhält sich das erneute Schneiden mit zugrunde liegenden Arrays in Go-Slices?. 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