Maison > développement back-end > Golang > le corps du texte

La sortie de Goroutine est incorrecte

WBOY
Libérer: 2024-02-11 14:20:08
avant
917 Les gens l'ont consulté

Goroutine 的输出不正确

L'éditeur PHP Zimo vous pose aujourd'hui une question sur Goroutine : Pourquoi le résultat de sortie de Goroutine est-il parfois incorrect ? Goroutine est un thread léger dans le langage Go qui peut exécuter des tâches simultanément, mais ses résultats de sortie peuvent parfois être incorrects. Alors, quelle est la raison de cette situation ? Explorons-le ensemble ! En comprenant ce problème, nous pouvons mieux comprendre le fonctionnement de Goroutine et éviter de rencontrer des problèmes similaires dans le développement réel.

Contenu de la question

Je regardais une conférence dans laquelle l'auteur a construit une application de statut à l'aide de routines go qui se comportait étrangement après un certain temps.

Le code est le suivant :

65bcd28b0b95

Le résultat que j'obtiens est :

65bcd28b0ba0

Je ne comprends pas pourquoi « amazon.com » continue de se répéter ici ? Pourquoi cela se produit-il après avoir imprimé les 5 liens ?

Solution de contournement

Le problème vient de la variable de boucle l 的闭包捕获。由于 goroutine 是在循环内启动的,因此循环创建的所有 goroutine 共享 l 的相同内存地址。当睡眠结束并执行 goroutine 时,由于循环迭代剩余的链接,l 的值已更改。因此,所有 goroutine 最终都会检查 links le dernier lien de la tranche, qui est "http://amazon.com". Pour résoudre ce problème, vous devez transmettre la variable de boucle l en paramètre à la fonction anonyme à l'intérieur de la goroutine. Voici une version mise à jour du code :

for l := range c {
    go func(link string) {
        time.Sleep(5 * time.Second)
        checkLink(link, c)
    }(l)
}
Copier après la connexion

En passant l 作为参数传递给匿名函数,每个 goroutine 将拥有自己的 l comme argument à la fonction anonyme, chaque goroutine aura sa propre copie de

, conservant la valeur correcte pour chaque itération. 🎜

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:stackoverflow.com
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!