Sobes.tech
Senior

pacote principal importar ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Olá Mundo!" fmt.Println("Saída!") } erro fatal: todos os goroutines estão adormecidos - deadlock! goroutine 1 [receber canal]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa saiu: status 2.

sobes.tech IA

Resposta da IA

O erro fatal error: all goroutines are asleep - deadlock! ocorre quando todas as goroutines estão bloqueadas e nenhuma pode continuar.

Neste código:

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

O canal c é criado sem buffer, portanto, a operação de envio (c <-) e de recebimento (<-c) devem ocorrer simultaneamente.

Explicação:

  • A goroutine go fmt.Println(<-c) tenta receber um valor do canal c.
  • A goroutine principal tenta enviar o valor "Hello World!" ao canal c.

No entanto, como fmt.Println(<-c) é executada em uma goroutine separada e o envio ocorre na principal, pode acontecer de a goroutine de leitura ainda não estar pronta para receber os dados, e a goroutine principal fica bloqueada na operação de envio.

Como resultado, ambas as goroutines ficam bloqueadas: uma esperando para enviar, outra esperando para receber, mas nenhuma pode continuar — ocorre um deadlock.

Para resolver, pode-se:

  • Tornar o canal com buffer, por exemplo, c := make(chan string, 1), para que o envio não bloqueie.
  • Ou alterar a ordem das operações, enviando primeiro e lendo depois.

Exemplo com buffer:

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

Agora, o programa será executado sem deadlock.