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

  1. El canal ch se 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 de wg.Wait(). Esto provoca que las goroutines se bloqueen, ya que nadie lee del canal y el canal no está en búfer.

  2. El ciclo for v := range ch esperará 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.