Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ändert sich das Verhalten beim Anhängen von Slices, wenn aus einer Schleife neue Slices erstellt werden?

Warum ändert sich das Verhalten beim Anhängen von Slices, wenn aus einer Schleife neue Slices erstellt werden?

DDD
DDDOriginal
2024-11-03 12:46:31555Durchsuche

Why Does Slice Append Behavior Change When Creating New Slices from a Loop?

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!

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