Sobes.tech
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:

  1. Le canal ch est 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ès wg.Wait(). Cela bloque les goroutines, car personne ne lit dans le canal, qui n'est pas tamponné.

  2. La boucle for v := range ch attendra 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.