Slice vs Map: Parameter Referenzverhalten
In Go, Slices und Karten repräsentieren beide Referenztypen. Bei der Änderung eines Elements in beiden Typen spiegelt die Änderung in allen von ihnen abgeleiteten Scheiben/Karten wider. Dieses gemeinsame Änderungsverhalten ergibt sich aus der Zeiger-basierten Implementierung von Karten, bei denen Änderungen, die über einen Zeiger vorgenommen wurden, für die Originalkarte gelten.
, wenn sich jedoch neue Elemente, Scheiben und Karten hinzufügen, verhalten sich anders. In dem angegebenen Code -Beispiel führt das Anhängen neuer Elemente an eine Karte (editMap) dazu, dass die Elemente über die ursprüngliche Karte zugänglich sind. Das Anhängen an ein Slice (Editslice) hat jedoch keinen Einfluss auf die ursprüngliche Slice.
Diese Diskrepanz beruht auf den zugrunde liegenden Implementierungsunterschieden zwischen Scheiben und Karten. Karten werden als Zeiger auf Hash -Kartenstrukturen implementiert, während Scheiben leichte Strukturen sind, die 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. Da GO jedoch Variablen nach Wert übergeht, spiegeln alle Änderungen an der Kopie des Slice-Headers (im übergegebenen Parameter) nicht in der ursprünglichen Slice wider.
, um ein konsistentes Verhalten zwischen Scheiben und Karten zu erreichen, könnte man Scheiben als Zeiger implementieren, ähnlich wie Karten. Dies würde sicherstellen, dass Änderungen, die durch Zeiger zu Scheiben vorgenommen wurden, auch die ursprüngliche Scheibe ändern. Dieser Ansatz ist jedoch ungewöhnlich in Go, da es an Sprachunterstützung für das Bestehen und Arbeiten mit Slice -Zeigern mangelt. Stattdessen wird die Konvention der Rückgabe neuer Scheiben nach der Änderung weit verbreitet.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3