


GO MAP ITERATION FALL: Warum zeigen alle Werte auf das letzte Element?
Wenn sie in Kombination mit map
for...range
GO verwendet werden, ist eine gemeinsame Falle anfällig: Wenn Sie das Scheiben durchqueren und Elemente zur map
hinzufügen, weisen alle map
schließlich auf das letzte Element hin. Dieser Artikel wird seine Gründe anhand von Codebeispielen analysieren und Lösungen bereitstellen.
Schauen wir uns einen Code an:
Geben Sie Schülerstrukturen ein { Name Zeichenfolge Alter int } func main () { m: = make (map [string]*student) Schüler: = [] Schüler { {Name: "pprof.cn", Alter: 18}, {Name: "Test", Alter: 23}, {Name: "Blog", Alter: 28}, } Für _, stu: = Bereichsschüler { m [stu.name] = & stu // Das Problem ist hier} für k, v: = Bereich m { fmt.println (k, "=>", v.name) } }
Das erwartete Ergebnis dieses Codes besteht darin, jede Student
in students
in map
zu speichern. Die Run -Ergebnisse zeigen jedoch, dass alle map
auf das letzte Element "Blog" hinweisen:
<code>pprof.cn => 博客测试=> 博客博客=> 博客</code>
Die Wurzel des Problems: variabler Umfang von for...range
Das Problem ist, dass stu
-Variable in der for...range
-Schleife nicht jede Iteration eine neue Variable erzeugt. Es zeigt auf die gleiche Speicheradresse in den students
. Jede Iteration, der Wert von stu
, wird aktualisiert, aber ihre Speicheradresse bleibt gleich. Wenn also die Schleife vorbei ist, verweisen alle Zeiger im map
auf den Endwert von stu
(das letzte Element).
Lösung: Erstellen Sie eine neue Kopie der Variablen
Um dieses Problem zu lösen, müssen wir in jeder Iteration eine Kopie der stu
-Variablen erstellen und sicherstellen, dass map
unterschiedliche Speicheradressen speichert. Der geänderte Code lautet wie folgt:
Für _, stu: = Bereichsschüler { NewStu: = stu // Erstellen Sie eine Kopie m [newstu.name] = & newstu }
Oder eine prägnantere Möglichkeit besteht darin, eine neue Student
direkt zu erstellen:
Für _, stu: = Bereichsschüler { m [stu.name] = & student {name: stu.name, Alter: stu.age} // Erstellen Sie eine neue Schülerinstanz}
Bei der obigen Änderung zeigt jeder Wert in map
auf eine andere Speicheradresse und vermeidet den Fall, in dem alle Werte auf das letzte Element hinweisen. Durch Ausführen des geänderten Codes wird die erwarteten Ergebnisse erhalten.
Hoffentlich hilft Ihnen diese Erklärung Ihnen, die Details für for...range
und map
in Go zu verstehen und solche Fallen zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum werden alle Werte das letzte Element, wenn sie für den Bereich in der GO -Sprache verwendet werden, um Scheiben zu durchqueren und Karten zu speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

In Artikeln werden Schleifen in Go verwendet, um "für", Arten von Schleifen, Optimierungstechniken und häufige Fehler zu vermeiden. Das Hauptaugenmerk liegt auf einer effektiven Schleife in Go. [159 Zeichen]

In dem Artikel werden die Syntax und Best Practices zum Erstellen von Funktionen in GO, einschließlich Parametern, Rückgabetypen, benannten Rückgabewerten und Funktionen für Funktionen, erläutert.

Golang verwendet verschiedene Datentypen wie Bool, Int, Uint, Float, String und Rune für verschiedene Datendarstellungen. Wichtige Unterschiede zwischen INT und Uint und der Verwendung von String vs. Rune werden diskutiert.

GoisastrongchoiceForProjectSeNeedingImplication, Leistung und Konkurrenz, ButitmaylackinadvancedFeatures undcosystemmaturity.1) Go'SSYNTAXISMPEANDEALEDELTOLEARN, FEHTTOFEWERBUGSANDMOREMINTAINABLECODE, obwohl es sich

Go'Sinitfunctionandjava'SstaticInitializersBothServetosetupenvironmentBeforethemaNfunction, Buttheydifferinexexcution undControl

ThecommonusecasesFortheinitfunctioningoare: 1) LadekonfigurationsfiguresbeforethemaProgramstarts, 2) Initialisierungsglobalvariablen und 3) RunningPre-ChecksorvalidationsBeforTheProgramProcececececeers.

ChannelsarecrucialingoforenablingsAfeAnDefficienceCommunicationBetweengoroutines.TheyfacilitateSynchronizationAndManageGoroutinElifecycle, EssentialforcurrentProgramming.ChannelsallowsendingandReceive -Values, ActaStarnalsforsynchronisierungen und Subors

In Go können Fehler verpackt und ein Kontext über Fehler hinzugefügt werden. 1) Mit der neuen Funktion des Fehlerpakets können Sie während der Fehlerausbreitung Kontextinformationen hinzufügen. 2) Helfen Sie dabei, das Problem zu lokalisieren, indem Sie Fehler über FMT.Errorf und %W einwickeln. 3) Benutzerdefinierte Fehlertypen können mehr semantische Fehler erzeugen und die ausdrucksstarke Fähigkeit der Fehlerbehandlung verbessern.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Linux neue Version
SublimeText3 Linux neueste Version

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor
