La mejor manera de usar sync.WaitGroup con función externa
Tengo algunos problemas con el siguiente código:
package main
import (
"fmt"
"sync"
)
// This program should go to 11, but sometimes it only prints 1 to 10.
func main() {
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
go Print(ch, wg) //
go func(){
for i := 1; i <= 11; i++ {
ch <- i
}
close(ch)
defer wg.Done()
}()
wg.Wait() //deadlock here
}
// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
func Print(ch <-chan int, wg sync.WaitGroup) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
defer wg.Done()
}
Tengo un punto muerto en el lugar especificado. He intentado configurarwg.Add(1)
en lugar de 2 y resuelve mi problema. Creo que no estoy enviando el canal con éxito como argumento paraPrinter
función. ¿Hay una manera de hacerlo? De lo contrario, una solución a mi problema es reemplazar elgo Print(ch, wg)
linea con:
go func() {
Print(ch)
defer wg.Done()
}
y cambiando elPrinter
función para:
func Print(ch <-chan int) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
}
¿Cuál es la mejor solución?