Senior
paquete principal importar ( "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("resultado: %d\n", sum) }
sobes.tech AI
Respuesta de la IA
En este código hay varios problemas:
-
El canal
chse crea sin búfer, y en las goroutines se escribe en el canal, pero en la función principal la lectura del canal comienza solo después dewg.Wait(). Esto provoca que las goroutines se bloqueen, ya que nadie lee del canal y el canal no está en búfer. -
El ciclo
for v := range chesperará indefinidamente, ya que el canal no está cerrado, y después de escribir tres valores, el programa no terminará.
Para corregir el código, es necesario:
- Hacer que el canal sea en búfer con tamaño 3 (cantidad de goroutines), para que las goroutines puedan escribir valores sin bloquearse.
- Cerrar el canal después de que todas las goroutines terminen.
Ejemplo corregido:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // canal en búfer
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) // cerramos el canal
var sum int
for v := range ch {
sum += v
}
fmt.Printf("resultado: %d\n", sum)
}
Ahora el programa calcula correctamente la suma de los cuadrados de los números 0, 1 y 2 y muestra el resultado.