Heim > Backend-Entwicklung > Golang > Warum ändert sich die Kapazität durch das Löschen der ersten Slice-Elemente, durch das Löschen der letzten Elemente jedoch nicht?

Warum ändert sich die Kapazität durch das Löschen der ersten Slice-Elemente, durch das Löschen der letzten Elemente jedoch nicht?

Susan Sarandon
Freigeben: 2024-11-02 21:58:02
Original
1054 Leute haben es durchsucht

Why Does Dropping First Slice Elements Change Capacity, But Dropping Last Elements Doesn't?

Slice-Kapazität ändern: Unterschiede zwischen dem Löschen des ersten und letzten Elements

Beim Erkunden der Slice-Funktionalität von Go stellt sich häufig die Frage: Warum funktioniert ein Slice? Kapazität verhält sich beim Löschen der ersten n Elemente anders als bei den letzten n Elementen?

Um dies zu beantworten, ist es wichtig zu verstehen, dass Go-Slices wie folgt strukturiert sind:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
Nach dem Login kopieren

Letzte n Elemente löschen

Wenn die letzten n Elemente aus einem Slice entfernt werden (z. B. s = s[:len(s)-2]), werden die Daten des Slice weiterhin im zugrunde liegenden Array gespeichert . Das Feld „len“ wird aktualisiert, um die neue Länge des Slice widerzuspiegeln, während das Feld „cap“ unverändert bleibt. Dadurch bleibt die gleiche Array-Zuordnung für das Slice erhalten.

Erste n Elemente löschen

Wenn jedoch die ersten n Elemente gelöscht werden (z. B. s = s[2: ]), müssen die zugrunde liegenden Daten des Slice in einen anderen Teil desselben Arrays verschoben werden. Dies liegt daran, dass der ursprüngliche Speicherort für die ersten n Elemente nicht mehr gültig ist. Als Ergebnis wird ein neues Slice mit einem anderen Array-Zeiger erstellt, wobei sowohl die Len- als auch die Cap-Felder angepasst werden.

Um dies zu veranschaulichen, erweitern wir die printSlice-Funktion, um den Zeiger auf das zugrunde liegende Array anzuzeigen:

<code class="go">func printSlice(s []int) {
    var ptr *int
    if cap(s) >= 1 {
        ptr = &amp;s[:cap(s)][0]
    }
    fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}</code>
Nach dem Login kopieren

Das Ausführen dieses geänderten Codes zeigt, wie die Slicing-Vorgänge den Zeiger, die Länge und die Kapazität ändern und bestätigt das oben beschriebene Verhalten.

Das obige ist der detaillierte Inhalt vonWarum ändert sich die Kapazität durch das Löschen der ersten Slice-Elemente, durch das Löschen der letzten Elemente jedoch nicht?. 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