Sobes.tech
Senior

pacchetto principale importa ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Ciao Mondo!" fmt.Println("Uscita!") } errore fatale: tutte le goroutine sono addormentate - deadlock! goroutine 1 [ricezione del canale]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programma uscito: stato 2.

sobes.tech AI

Risposta dell'AI

L'errore fatal error: all goroutines are asleep - deadlock! si verifica quando tutte le goroutine sono bloccate e nessuna può continuare.

Nel codice:

c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Il canale c viene creato senza buffer, quindi le operazioni di invio (c <-) e ricezione (<-c) devono avvenire contemporaneamente.

Spiegazione:

  • La goroutine go fmt.Println(<-c) tenta di ricevere un valore dal canale c.
  • La goroutine principale tenta di inviare il valore "Hello World!" al canale c.

Tuttavia, poiché fmt.Println(<-c) viene eseguito in una goroutine separata e l'invio avviene nella goroutine principale, può succedere che la goroutine di ricezione non sia ancora pronta a ricevere i dati, e la goroutine principale si blocchi sull'invio.

Di conseguenza, entrambe le goroutine si bloccano: una aspetta di inviare, l'altra di ricevere, ma nessuna può continuare — si verifica un deadlock.

Per risolvere, si può:

  • Rendere il canale con buffer, ad esempio c := make(chan string, 1), in modo che l'invio non blocchi.
  • O cambiare l'ordine delle operazioni, inviando prima e leggendo dopo.

Esempio con buffer:

c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")

Ora il programma verrà eseguito senza deadlock.