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 canalec. - La goroutine principale tenta di inviare il valore
"Hello World!"al canalec.
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.