Im Gegensatz zur integrierten API-Dokumentation erstellt die Funktion append() nicht immer ein neues Slice . Dies wird durch die Kapazität des ursprünglichen Slice und die Anzahl der hinzuzufügenden Elemente bestimmt.
Im bereitgestellten Code-Snippet, in dem Kombinationen von Booleschen Werten rekursiv erstellt werden, geben die Ausrufezeichen die Slices an, von denen in den Kanal gesendet wird die AddOption-Funktion. Allerdings werden die Slices, die auf der anderen Seite in main() auftauchen, geändert.
Die Verwirrung entsteht durch die Unterscheidung zwischen dem Slice-Datentyp und seiner internen Darstellung. Der Slice-Deskriptor besteht aus zwei Ganzzahlen (Länge und Kapazität) und einem Zeiger auf die zugrunde liegenden Daten. Daher gibt append() ein neues Slice mit einem neuen Deskriptor, aber demselben Zeiger auf Daten zurück.
Dies wird im folgenden Codebeispiel veranschaulicht:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
Ausgabe:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
Dies zeigt, dass sowohl a als auch b denselben Datenzeiger verwenden, da der ursprüngliche Slice noch über Kapazität verfügt. Wenn wir jedoch die Kapazität auf 4 reduzieren:
<code class="go">s := make([]int, 0, 4)</code>
Die Ausgabe wird:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
Da das ursprüngliche Slice nicht mehr über genügend Kapazität verfügt, erstellt append() ein neues Slice mit ein neuer Datenzeiger für b.
Das obige ist der detaillierte Inhalt vonWann weist die Funktion „append()' von Golang ein neues Slice zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!