Wann erstellt append() in Go ein neues Slice?
Kontext:
Die Funktion „Go append()“ wird verwendet, um ein oder mehrere Elemente an einen Slice anzuhängen, und es ist dokumentiert, dass ein neuer Slice erstellt wird, wenn die Kapazität des ursprünglichen Slice nicht ausreicht. Eine Untersuchung eines rekursiven Algorithmus, der einem Slice Elemente hinzufügt, hat jedoch gezeigt, dass über einen Kanal gesendete Slices nach dem Senden scheinbar geändert werden.
Verwirrung:
Diese Beobachtung widerspricht der Dokumentation, die darauf hinweist, dass append() ein neues Slice zurückgeben sollte. Diese Verwirrung entsteht, weil sich die append()-Dokumentation auf den Slice-Datentyp bezieht, während die eigentliche Implementierung mit Slice-Deskriptoren arbeitet.
Lösung:
Ein Slice-Deskriptor besteht aus drei Komponenten: eine Länge, eine Kapazität und einen Zeiger auf die zugrunde liegenden Daten. Wenn append() aufgerufen wird, gibt es einen neuen Slice-Deskriptor mit aktualisierter Länge und Kapazität zurück. Der Zeiger auf die zugrunde liegenden Daten bleibt jedoch derselbe.
Erklärung:
Während append() einen neuen Slice-Deskriptor zurückgibt, bleiben die tatsächlichen Daten bestehen zwischen den alten und neuen Slices geteilt. Dies liegt daran, dass die zugrunde liegenden Daten an einem separaten Speicherort gespeichert werden, auf den der Slice-Deskriptor verweist.
Beispiel:
Der folgende Code veranschaulicht dieses Verhalten:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) }</code>
Die Ausgabe zeigt, dass die beiden modifizierten Slices a und b dieselben zugrunde liegenden Daten wie die ursprünglichen Slices s teilen, obwohl sie unterschiedliche Länge und Kapazität haben.
Das obige ist der detaillierte Inhalt vonErstellt die Funktion „append()' von Go immer ein neues Slice?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!