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
Libérer: 2024-06-05 19:40:01
original
501 Les gens l'ont consulté

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)
}
Copier après la connexion

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)
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal