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 }
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 = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
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!