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 canalc. - A goroutine principal tenta enviar o valor
"Hello World!"ao canalc.
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.