Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfassen anonyme Funktionen in den „for'-Schleifen von Go den Endwert der Schleifenvariablen?

Warum erfassen anonyme Funktionen in den „for'-Schleifen von Go den Endwert der Schleifenvariablen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-19 03:49:03780Durchsuche

Why Do Anonymous Functions in Go's `for` Loops Capture the Final Value of the Loop Variable?

Anonyme Funktionen in for-Schleifen: Unerwartetes Verhalten

In Ihrem Go-Programm haben Sie festgestellt, dass Ihr Scheduler nicht die erwartete Ausgabe druckt für jeden geplanten Job. Das Problem wird auf die Verwendung anonymer Funktionen in der for-Schleife zurückgeführt.

In einer for-Schleife erfasst die anonyme Funktion den Schleifenvariablenjob jedes Mal, wenn die Schleife ausgeführt wird. Da es jedoch nur eine anonyme Funktion gibt, verwendet sie die Jobvariable aus dem letzten Durchlauf der Schleife. Dies führt dazu, dass alle Jobs die Beschreibung des letzten Jobs drucken.

Lösung: Erstellen Sie eine neue Variable für jede Iteration

Um dieses Problem zu beheben, erstellen Sie eine neue Variable für jede Iteration der Schleife. Dadurch wird sichergestellt, dass jede anonyme Funktion ihren eigenen eindeutigen Wert der Schleifenvariablen erfasst:

for _, job := range config.Jobs {
    realJob := job // a new variable each time through the loop
    c.AddFunc("@every "+realJob.Interval, func() {
        DistributeJob(realJob)
    })
    log.Println("Job " + realJob.Name + " has been scheduled!")
}

Mit dieser Änderung verfügt jede anonyme Funktion über eine eigene Kopie der Jobvariablen, wodurch die Beschreibung des Jobs korrekt gedruckt wird es repräsentiert.

Das obige ist der detaillierte Inhalt vonWarum erfassen anonyme Funktionen in den „for'-Schleifen von Go den Endwert der Schleifenvariablen?. 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