suchen
HeimBackend-EntwicklungGolangWarum 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?

Warum 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?

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!

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
Wie erstellen Sie eine Schleife in Go?Wie erstellen Sie eine Schleife in Go?Apr 28, 2025 pm 05:06 PM

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]

Was ist die Syntax zum Erstellen einer Funktion in Go?Was ist die Syntax zum Erstellen einer Funktion in Go?Apr 28, 2025 pm 05:05 PM

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.

Welche Datentypen verwendet Golang?Welche Datentypen verwendet Golang?Apr 28, 2025 pm 05:03 PM

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.

Go vs. andere Sprachen: Eine vergleichende AnalyseGo vs. andere Sprachen: Eine vergleichende AnalyseApr 28, 2025 am 12:17 AM

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

Vergleich von Init -Funktionen in statischen Initialisierern in anderen SprachenVergleich von Init -Funktionen in statischen Initialisierern in anderen SprachenApr 28, 2025 am 12:16 AM

Go'Sinitfunctionandjava'SstaticInitializersBothServetosetupenvironmentBeforethemaNfunction, Buttheydifferinexexcution undControl

Häufige Anwendungsfälle für die Init -Funktion in GOHäufige Anwendungsfälle für die Init -Funktion in GOApr 28, 2025 am 12:13 AM

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

Kanäle in Go: Mastering Inter-Goroutine CommunicationKanäle in Go: Mastering Inter-Goroutine CommunicationApr 28, 2025 am 12:04 AM

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

Wickeln Fehler in Go: Hinzufügen von Kontext zu Fehlerketten HinzufügenWickeln Fehler in Go: Hinzufügen von Kontext zu Fehlerketten HinzufügenApr 28, 2025 am 12:02 AM

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.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version

DVWA

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

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

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor