package principal import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Bonjour le monde!" fmt.Println("Sortie!") } Erreur fatale : tous les goroutines sont endormis - deadlock! goroutine 1 [réception du canal] : main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programme terminé : statut 2.
sobes.tech IA
Réponse de l'IA
L'erreur fatal error: all goroutines are asleep - deadlock! se produit lorsque toutes les goroutines sont bloquées et qu'aucune ne peut continuer.
Dans ce code :
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Le canal c est créé sans tampon, donc l'opération d'envoi (c <-) et de réception (<-c) doivent se produire simultanément.
Explication :
- La goroutine
go fmt.Println(<-c)tente de recevoir une valeur du canalc. - La goroutine principale tente d'envoyer la valeur
"Hello World!"au canalc.
Cependant, comme fmt.Println(<-c) s'exécute dans une goroutine séparée et que l'envoi se produit dans la principale, il est possible que la goroutine de lecture ne soit pas encore prête à recevoir des données, et la goroutine principale se bloque lors de l'envoi.
En conséquence, les deux goroutines se bloquent : l'une attend pour envoyer, l'autre pour recevoir, mais aucune ne peut continuer — ce qui provoque un deadlock.
Pour corriger cela, on peut :
- Rendre le canal tamponné, par exemple
c := make(chan string, 1), pour que l'envoi ne bloque pas. - Ou changer l'ordre des opérations, en envoyant d'abord puis en lisant.
Exemple avec tampon :
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Ainsi, le programme s'exécutera sans deadlock.