Heim >Backend-Entwicklung >Golang >Warum verändert das Anhängen an ein Go-Slice manchmal das ursprüngliche Slice?

Warum verändert das Anhängen an ein Go-Slice manchmal das ursprüngliche Slice?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 17:00:30856Durchsuche

Why does appending to a Go slice sometimes modify the original slice?

Slice-Zuweisungsverhalten von Golang Append

In Go ist es beim Anhängen an ein Slice notwendig, das Zuweisungsverhalten zu verstehen, um eine effiziente Handhabung sicherzustellen.

Laut der integrierten API-Dokumentation ordnet die Funktion append() Daten neu zu und kopiert sie in einen neuen Array-Block, wenn die Kapazität des vorhandenen Slice nicht ausreicht. Dies wirft Fragen zur Art des Slice-Deskriptors und des von append() zurückgegebenen Slice auf.

Im bereitgestellten rekursiven Algorithmus zum Generieren von Kombinationen wird die Funktion append() verwendet, um Slices inkrementell zu erstellen. Es wurde jedoch beobachtet, dass über einen Kanal von der AddOption-Funktion gesendete Slices nach dem Senden geändert werden. Dies widerspricht der Erwartung, dass append() ein neues Slice zurückgeben sollte.

Um diese scheinbare Diskrepanz zu beheben, ist es wichtig, den Unterschied zwischen dem Slice-Datentyp und seiner zugrunde liegenden Darstellung zu klären. Der Slice-Deskriptor besteht aus zwei Ganzzahlen (Länge und Kapazität) und einem Zeiger auf die tatsächlichen Daten. Wenn append() ein neues Slice erstellt, generiert es einen neuen Slice-Deskriptor, behält jedoch denselben Datenzeiger wie das ursprüngliche Slice bei. Daher wirken sich Änderungen an einem der Slice-Deskriptoren auf beide Slices aus.

Um dies zu veranschaulichen, betrachten Sie den folgenden Codeausschnitt:

<code class="go">s := make([]int, 0, 5)
s = append(s, []int{1, 2, 3, 4}...)

a := append(s, 5)
fmt.Println(a)  // [1 2 3 4 5]

b := append(s, 6)
fmt.Println(b)  // [1 2 3 4 6]
fmt.Println(a)  // [1 2 3 4 6]</code>

Anfangs hat s eine Kapazität von 5 und wird mit make erstellt (). append() wird verwendet, um die Elemente eines anderen Slice zu s hinzuzufügen. Dann werden zwei neue Slices, a und b, mit append() für s mit unterschiedlichen Elementen erstellt. Betrachtet man die Ausgabe, enthalten sowohl a als auch b dieselben Daten, was darauf hinweist, dass sie denselben Datenzeiger verwenden. Dies zeigt das oben beschriebene Verhalten.

Um eine effiziente Slice-Manipulation sicherzustellen, ist es wichtig, dieses Zuordnungsverhalten von append() zu verstehen. Wenn die Kapazität des vorhandenen Slice ausreicht, manipuliert append() den vorhandenen Datenzeiger direkt und macht ihn so effizienter.

Das obige ist der detaillierte Inhalt vonWarum verändert das Anhängen an ein Go-Slice manchmal das ursprüngliche Slice?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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