Vous ne recevez qu'une seule valeur du canal (qui sera la valeur envoyée par l'un des foo()
appels, imprévisible qui des nombreux) , mais vous voulez tout recevoir.
Il faut donc utiliser une boucle for
pour recevoir autant de valeurs que vous envoyez (envoyé) à ce sujet:
for i := 0; i < 10; i++ {
flg = flg || <-ch
}
Bien que dans votre cas, il serait suffisant pour boucle jusqu'à une valeur true
est reçue, car cela déterminez la valeur finale de flg
, mais il est toujours recommandé de recevoir toutes les valeurs sinon les goroutines restantes seront bloquées (car ch
est un canal non tamponné). Dans cet exemple, cela n'a pas d'importance, mais dans une application "réelle", les goroutines seraient bloquées pour toujours (fuite de mémoire).
Si vous ne voulez pas attendre que tous les appels foo()
à remplir et retourner le plus tôt possible (dès une valeur true
est rencontrée), une option est de faire ch
tamponnées, de sorte que tous les goroutines peuvent envoyer des valeurs sur sans être bloqué.Et cette façon, vous n'êtes pas obligé de recevoir (et donc attendre) tous les appels foo()
à compléter:
ch := make(chan bool, 10)
for i := 0; i < 10; i++ {
go foo(i, ch)
}
flg := false
for i := 0; i < 10; i++ {
if <-ch {
flg = true
break
}
}
Le choix de cette approche, vous devez fournir des moyens d'annuler goroutines dont le travail est plus nécessaire pour éviter CPU inutiles (et mémoire). context.Context
est un tel moyen, en savoir plus à ce sujet ici: Close multiple goroutine if an error occurs in one in go.
"Comment réaliser cela en utilisant des canaux?" --- Pour quelle raison devez-vous utiliser des canaux pour cela? – zerkms
S'il vous plaît nous montrer votre tentative. Votre code n'utilise aucun canal. – Flimzy
(aussi, il est conseillé d'utiliser 'gofmt', car votre code n'est pas facile à lire comme écrit) – Flimzy