Senior
paquet principal importer ( "fmt" "sync" ) func main() { ch := make(chan int) wg := &sync.WaitGroup{} wg.Add(3) for i := 0; i < 3; i++ { go func(v int) { defer wg.Done() ch <- v * v }(i) } wg.Wait() var sum int for v := range ch { sum += v } fmt.Printf("résultat : %d\n", sum) }
sobes.tech IA
Réponse de l'IA
Ce code présente plusieurs problèmes:
-
Le canal
chest créé sans tampon, et dans les goroutines, on écrit dans le canal, mais dans la fonction principale, la lecture du canal ne commence qu'aprèswg.Wait(). Cela bloque les goroutines, car personne ne lit dans le canal, qui n'est pas tamponné. -
La boucle
for v := range chattendra indéfiniment, car le canal n'est pas fermé, et après avoir écrit trois valeurs, le programme ne se terminera pas.
Pour corriger le code, il faut:
- Rendre le canal tamponné avec une taille de 3 (nombre de goroutines), pour que les goroutines puissent écrire sans bloquer.
- Fermer le canal après que toutes les goroutines aient terminé.
Exemple corrigé:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // canal tamponné
wg := &sync.WaitGroup{}
wg.Add(3)
for i := 0; i < 3; i++ {
go func(v int) {
defer wg.Done()
ch <- v * v
}(i)
}
wg.Wait()
close(ch) // on ferme le canal
var sum int
for v := range ch {
sum += v
}
fmt.Printf("résultat: %d\n", sum)
}
Ce programme calcule maintenant correctement la somme des carrés des nombres 0, 1 et 2 et affiche le résultat.