Geheimnis der sich ändernden Slice-Kapazität
A Tour of Go bietet einen faszinierenden Ausschnitt, der die Slice-Manipulation demonstriert. Obwohl das Slice in Scheiben geschnitten wird, die Länge Null bleibt und es dann verlängert wird, liegt das Rätsel darin, warum die Kapazität in der letzten Zeile von 6 auf 4 sinkt.
Slice-Interna verstehen
Um dieses Rätsel zu lösen, ist es wichtig, sich daran zu erinnern, dass ein Slice Daten in einem Array speichert. Wenn die beiden ersten Elemente gelöscht werden, wird der Anfang des Slice nach rechts verschoben, wodurch weniger nicht zugewiesene Slots zwischen dem Anfangspunkt des Slice und dem Ende des Backing-Arrays verbleiben.
Umgekehrt werden Elemente vom Ende eines Slice entfernt hat keinen Einfluss auf seine Kapazität, da der Abstand zwischen dem Startpunkt des Slice innerhalb des Arrays und dem Ende des Arrays unverändert bleibt.
Es ist wichtig zu beachten, dass diese Vorgänge lediglich die Slice-Struktur ändern, ohne das zugrunde liegende Array zu beeinflussen.
Beispielerklärung
Durch das Drucken des Slice-Headers erhalten wir Einblick in die auftretenden Änderungen:
<code class="go">func printSlice(s []int) { sh := (*reflect.SliceHeader)(unsafe.Pointer(&s)) fmt.Printf("header=%+v len=%d cap=%d %v\n", sh, len(s), cap(s), s) }</code>
Im letzten Schritt wird der Der Datenzeiger wird vorgeschoben, was zu einer Verringerung der Kapazität führt.
Fazit
In diesem Beispiel beobachten wir, wie Slicing-Vorgänge die Struktur des Slice ändern können. Durch die Manipulation der Zeiger können Kapazitätsänderungen basierend auf den spezifischen Aktionen auftreten, die auf dem Slice ausgeführt werden.
Das obige ist der detaillierte Inhalt vonWarum sinkt die Slice-Kapazität, wenn Elemente von Anfang an entfernt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!