Heim >Backend-Entwicklung >Golang >Wie erfasst man lokale Variablen mithilfe von Abschlüssen in Goroutine?

Wie erfasst man lokale Variablen mithilfe von Abschlüssen in Goroutine?

WBOY
WBOYOriginal
2024-06-05 19:40:01487Durchsuche

In Goroutine können Schließungen verwendet werden, um lokale Variablen zu erfassen, sodass sie während der Goroutine-Ausführung verfügbar bleiben. Indem Sie eine lokale Variable als Argument an eine anonyme Funktion übergeben, können Sie die Variable beim Start der Goroutine erfassen. Durch die Verwendung von Abschlüssen können Daten zwischen gleichzeitig ausgeführten Goroutinen gemeinsam genutzt und geändert werden, während gleichzeitig die Thread-Sicherheit gewährleistet wird.

如何在 Goroutine 中使用闭包捕获局部变量?

So verwenden Sie Abschlüsse zum Erfassen lokaler Variablen in Goroutine

Ein Abschluss ist eine Funktion, die auf externe Variablen oder Ressourcen zugreifen kann, die bei ihrer Erstellung bereits vorhanden sind. In Go werden Abschlüsse mithilfe anonymer Funktionen erstellt.

Lokale Variablen erfassen

Wenn wir eine anonyme Funktion in Goroutine starten, kann die Funktion alle lokalen Variablen erfassen, die beim Start von Goroutine vorhanden sind.

Hier ist ein Codebeispiel für die Erfassung lokaler Variablen:

package main

import (
    "fmt"
    "time"
)

func main() {
    i := 0

    for i < 10 {
        go func(i int) {
            fmt.Println(i)
        }(i)
        i++
    }

    time.Sleep(time.Second)
}

Praktisches Beispiel

Wir können Schließungen verwenden, um einen Zähler zu erstellen, der parallel ausgeführt wird. Jede Goroutine verfügt über einen eigenen privaten Zähler, auf den sicher zugegriffen und gleichzeitig geändert werden kann:

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
    "time"
)

func main() {
    var wg sync.WaitGroup
    var counter uint64

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            for j := 0; j < 1000000; j++ {
                // 使用原子操作确保并发安全
                atomic.AddUint64(&counter, 1)
            }
            fmt.Println("Goroutine", i, "finished")
        }(i)
    }

    wg.Wait()
    fmt.Println("Total count:", counter)
}

Auf diese Weise haben wir 10 Goroutinen parallel erstellt, jede Goroutine hat ihren eigenen Zähler und führt 1 Million automatische Inkrementierungsvorgänge gleichzeitig durch. Wir erhalten die Gesamtzahl. Da jede Goroutine ihre eigene lokale Zählervariable mithilfe eines Abschlusses erfasst, ist der gleichzeitige Zugriff und die Änderung des Zählers threadsicher.

Das obige ist der detaillierte Inhalt vonWie erfasst man lokale Variablen mithilfe von Abschlüssen in Goroutine?. 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