Heim > Artikel > Backend-Entwicklung > Wann sollten Parameter und Abschlüsse in Go Anonymous-Funktionen verwendet werden?
In Go können sich anonyme Funktionen mit übergebenen Parametern anders verhalten als Abschlüsse. Dieser Artikel befasst sich mit der Unterscheidung und ihren Auswirkungen.
Abschlussbeispiel:
func main() { done := make(chan bool, 1) go func() { time.Sleep(50 * time.Millisecond) done <- true }() <-done }
In diesem Abschluss hat die anonyme Funktion keine Parameter und greift stattdessen auf den im umgebenden Bereich vorhandenen Fertigkanal zu.
Parameterbeispiel:
func main() { done := make(chan bool, 1) go func(c chan bool) { time.Sleep(50 * time.Millisecond) c <- true }(done) <-done }
In diesem Fall nimmt die anonyme Funktion einen Parameter c an, der ein Kanal ist, und interagiert direkt damit.
Wann Parameter zu verwenden sind
Die Übergabe von Parametern an eine anonyme Funktion ist vor allem in Szenarien von Vorteil, in denen die gemeinsame Nutzung von Variablen zu unerwartetem Verhalten führen kann. Betrachten Sie das folgende Beispiel:
for i := 0; i < 3; i++ { go func() { fmt.Println(i) }() // Closure }
Hier ist die anonyme Funktion ein Abschluss, d. h. sie bezieht sich auf die i-Variable, die in der for-Schleife definiert ist. Da alle Goroutinen die gleiche i-Variable verwenden, geben sie „3“ aus (den Endwert von i nach Abschluss der Schleife), auch wenn wir erwarten können, dass sie „0“, „1“ und „2“ ausgeben.
Um dieses Problem zu beheben, können wir i als Parameter übergeben:
for i := 0; i < 3; i++ { go func(v int) { fmt.Println(v) }(i) // Parameter }
Jetzt erhält jede Goroutine eine Kopie der i-Variablen, wenn die Funktion aufgerufen wird, was zur korrekten Ausgabe führt: „ 0", „1“ und „2“.
Fazit
Während Abschlüsse einen bequemen Zugriff auf Variablen im umgebenden Bereich ermöglichen, sorgt die Übergabe von Parametern für mehr Kontrolle und sorgt für vorhersehbares Verhalten beim Umgang mit gemeinsam genutzten Variablen, insbesondere in gleichzeitigen Szenarien.
Das obige ist der detaillierte Inhalt vonWann sollten Parameter und Abschlüsse in Go Anonymous-Funktionen verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!