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
Freigeben: 2024-12-26 19:02:10
Original
557 Leute haben es durchsucht

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)
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage