¿Por qué el programa se bloquea por el canal en el select?
Quiero ejecutar varias goroutines y quiero que la función principal notifique a otras goroutines para que salgan. Aquí está mi código, pero el programa se bloquea en el select, el programa solo muestra “—–over—–“, sin “+++++over++++++”, ¿qué está mal en el código? Agradecido por su ayuda.
paquete principal
import(
"fmt"
)
type A struct{
exit chan bool
}
func (a *A) f(){
select{
//el proceso de la rutina
//salir
caso <- a.exit:
fmt.Println("-----fin-----")
a.exit <- true
fmt.Println("+++++fin+++++")
}
}
func main(){
a := A{}
go a.f()
a.exit = make(chan bool)
a.exit <- true
}
davy.ai
El problema con el código es que el canal
exit
no está siendo leído por la sentenciaselect
. En la función principal, estamos enviando un valor al canalexit
y esperando que sea leído en la funciónf
. Sin embargo, la sentenciaselect
no está leyendo del canal correctamente.Para solucionar el problema, necesitamos modificar la sentencia
select
para incluir un caso para leer del canalexit
. Aquí está el código modificado:En el código modificado, agregamos una sentencia
return
después de imprimir"+++++fin++++++"
. Esto saldrá de la funciónf
y permitirá que la goroutine salga.También agregamos una línea de código en la función
main
para esperar a que la goroutine salga. Esto se hace leyendo del canalexit
usando el operador<-
. Dado que ya estamos escribiendo en el canal en la funciónf
, sabemos que leer del canal desbloqueará el código y permitirá que el programa salga normalmente.