Sobes.tech
Senior

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 canal c.
  • La goroutine principal intenta enviar el valor "Hello World!" al canal c.

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.