Heim  >  Artikel  >  Backend-Entwicklung  >  Wann sollten Parameter und Abschlüsse in Go Anonymous-Funktionen verwendet werden?

Wann sollten Parameter und Abschlüsse in Go Anonymous-Funktionen verwendet werden?

Barbara Streisand
Barbara StreisandOriginal
2024-11-19 05:00:02883Durchsuche

When to Use Parameters vs. Closures in Go Anonymous Functions?

Übergabe von Parametern an Funktionsabschlüsse

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!

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