Maison >développement back-end >Golang >Comment capturer des variables locales à l'aide de fermetures dans Goroutine ?

Comment capturer des variables locales à l'aide de fermetures dans Goroutine ?

WBOY
WBOYoriginal
2024-06-05 19:40:01489parcourir

Dans Goroutine, les fermetures peuvent être utilisées pour capturer des variables locales afin qu'elles restent disponibles pendant l'exécution de Goroutine. En passant une variable locale comme argument à une fonction anonyme, vous pouvez capturer la variable au démarrage de la goroutine. En utilisant des fermetures, les données peuvent être partagées et modifiées entre des Goroutines exécutées simultanément tout en garantissant la sécurité des threads.

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

Comment utiliser les fermetures pour capturer des variables locales dans Goroutine

Une fermeture est une fonction qui peut accéder à des variables externes ou à des ressources qui existent déjà lors de sa création. Dans Go, les fermetures sont créées à l'aide de fonctions anonymes.

Capturer les variables locales

Lorsque nous démarrons une fonction anonyme dans Goroutine, la fonction peut capturer toutes les variables locales qui existent au démarrage de Goroutine.

Voici un exemple de code montrant comment capturer des variables locales :

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)
}

Exemple pratique

Nous pouvons utiliser des fermetures pour créer un compteur qui s'exécute en parallèle. Chaque Goroutine possède son propre compteur privé, accessible et modifié simultanément en toute sécurité :

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)
}

De cette façon, nous avons créé 10 Goroutines en parallèle, chaque Goroutine possède son propre compteur et effectue 1 million d'opérations d'auto-incrémentation simultanément. Nous obtenons le décompte total. Étant donné que chaque Goroutine capture sa propre variable de compteur local à l'aide d'une fermeture, l'accès simultané et la modification du compteur sont thread-safe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn