paquete principal importar ( "fmt" ) función principal() { c := make(chan string) go fmt.Println(<-c) c <- "¡Hola Mundo!" fmt.Println("¡Salida!") } error fatal: ¡todos los goroutines están dormidos - deadlock! goroutine 1 [recepción de canal]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa finalizado: estado 2.
sobes.tech AI
Respuesta de la IA
El error fatal error: all goroutines are asleep - deadlock! ocurre cuando todas las goroutines están bloqueadas y ninguna puede continuar.
En este código:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
El canal c se crea sin búfer, por lo que la operación de envío (c <-) y la recepción (<-c) deben ocurrir simultáneamente.
Explicación:
- La goroutine
go fmt.Println(<-c)intenta recibir un valor del canalc. - La goroutine principal intenta enviar el valor
"Hello World!"al canalc.
Sin embargo, debido a que fmt.Println(<-c) se ejecuta en una goroutine separada y el envío ocurre en la principal, puede ocurrir que la goroutine de lectura aún no esté lista para recibir datos, y la goroutine principal se bloquee en el envío.
Como resultado, ambas goroutines se bloquean: una espera para enviar, otra para recibir, pero ninguna puede continuar, lo que provoca un bloqueo mutuo.
Para solucionar esto, se puede:
- Hacer que el canal sea con búfer, por ejemplo
c := make(chan string, 1), para que el envío no bloquee. - O cambiar el orden de las operaciones, enviando primero y leyendo después.
Ejemplo con búfer:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Ahora el programa se ejecutará sin bloqueo.