Heim >Backend-Entwicklung >Golang >Go Slices vs. Maps: Warum verhalten sich Anhänge anders?

Go Slices vs. Maps: Warum verhalten sich Anhänge anders?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-19 17:13:10319Durchsuche

Go Slices vs. Maps: Why Do Appends Behave Differently?

Slice vs. Map: Parameterreferenzverhalten verstehen

In Go repräsentieren sowohl Slices als auch Maps Referenztypen. Wenn Sie ein Element in einem der beiden Typen ändern, wirkt sich die Änderung auf alle davon abgeleiteten Slices/Maps aus. Dieses gemeinsame Änderungsverhalten ergibt sich aus der zeigerbasierten Implementierung von Karten, bei der über einen Zeiger vorgenommene Änderungen auf die ursprüngliche Karte angewendet werden.

Beim Hinzufügen neuer Elemente verhalten sich Slices und Karten jedoch unterschiedlich. Im bereitgestellten Codebeispiel führt das Anhängen neuer Elemente an eine Karte (editMap) dazu, dass auf diese Elemente über die ursprüngliche Karte zugegriffen werden kann. Das Anhängen an ein Slice (editSlice) hat jedoch keine Auswirkungen auf das ursprüngliche Slice.

Diese Diskrepanz ergibt sich aus den zugrunde liegenden Implementierungsunterschieden zwischen Slices und Maps. Karten werden als Zeiger auf Hash-Map-Strukturen implementiert, während Slices leichte Strukturen sind, die auf ein Array verweisen. Beim Hinzufügen eines neuen Elements zu einer Karte bleibt der Zeiger konstant, was zur Sichtbarkeit des neuen Elements in allen abgeleiteten Karten führt.

Im Gegensatz dazu wird beim Anhängen an ein Slice der Slice-Header (der die Länge des Slice beschreibt) Kapazität und Array-Zeiger) müssen geändert werden. Da Go jedoch Variablen nach Wert übergibt, werden alle an der Kopie des Slice-Headers (im übergebenen Parameter) vorgenommenen Änderungen nicht im Original-Slice widergespiegelt.

Um ein konsistentes Verhalten zwischen Slices und Maps zu erreichen, man könnte Slices als Zeiger implementieren, ähnlich wie bei Karten. Dies würde sicherstellen, dass Änderungen, die durch Zeiger auf Slices vorgenommen werden, auch das ursprüngliche Slice ändern. Allerdings ist dieser Ansatz in Go aufgrund der fehlenden Sprachunterstützung für die Übergabe und Arbeit mit Slice-Zeigern ungewöhnlich. Stattdessen ist die Konvention, nach der Änderung neue Slices zurückzugeben, weit verbreitet.

Das obige ist der detaillierte Inhalt vonGo Slices vs. Maps: Warum verhalten sich Anhänge anders?. 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