Unerwartetes Slice-Anhängeverhalten
Einführung in das Problem
Beim Anhängen von Elementen an ein Slice innerhalb eines In einer Schleife zeigen nachfolgende Versuche, neue Slices aus dem Schleifenergebnis zu erstellen, unerwartetes Verhalten. Insbesondere überschreibt das letzte Append-Element die Ergebnisse vorheriger Appends. Dieses Problem tritt auf, wenn neue Slices auf der Grundlage eines Slices erstellt werden, das aus einer Schleifeniteration erhalten wurde.
Analyse
Das beobachtete Verhalten ergibt sich aus der Tatsache, dass sowohl Go-Slices als auch Arrays verwendet werden die gleiche zugrunde liegende Datenstruktur. Beim Anhängen an ein Slice erstellt Go ein neues Slice-Objekt, das auf dasselbe zugrunde liegende Array verweist. Dies bedeutet, dass sich alle am Original-Slice vorgenommenen Änderungen auch auf die neuen Slices auswirken.
Lösung
Um dieses Verhalten zu vermeiden, ist es wichtig, das Slice vor der Erstellung zu kopieren etwaige Änderungen. Dadurch wird ein neues Slice-Objekt erstellt, das über einen eigenen unabhängigen Verweis auf das zugrunde liegende Array verfügt. Der idiomatische Weg, dies zu erreichen, ist die Verwendung der Kopierfunktion:
<code class="go">func makeFromSlice(sl []int) []int { result := make([]int, len(sl)) copy(result, sl) return result }</code>
Indem wir das Ergebnis von makeFromSlice(i) j in der Hauptfunktion zuweisen, erstellen wir ein neues Slice, das vom ursprünglichen i unabhängig ist Scheibe. Dieses neue Slice kann sicher geändert werden, ohne das Original zu beeinträchtigen.
Im Gegensatz zu Slice-Literalen
Slice-Literale wie {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} weisen immer ein neues zugrunde liegendes Array zu, wenn sie über ihre Kapazität hinaus angehängt werden. Dies erklärt, warum sich SliceFromLiteral wie erwartet verhält.
Fazit
Denken Sie beim Arbeiten mit Slices immer daran, eine Kopie zu erstellen, bevor Sie sie ändern. Dadurch wird sichergestellt, dass Änderungen an neuen Slices keine Auswirkungen auf das Original haben. Die Kopierfunktion bietet eine idiomatische und effiziente Möglichkeit, dies zu tun.
Das obige ist der detaillierte Inhalt vonWarum ändert sich das Verhalten beim Anhängen von Slices, wenn aus einer Schleife neue Slices erstellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!