Sobes.tech
Senior

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 canal c.
  • La goroutine principale tente d'envoyer la valeur "Hello World!" au canal c.

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.