Назад к вопросам
Senior
5
package main import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Exit!") } fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program exited: status 2.
Компании, где спрашивали
Wildberries & Russ Bank
Ответ от нейросети
sobes.tech AI
Ошибка fatal error: all goroutines are asleep - deadlock! возникает, когда все горутины заблокированы и ни одна не может продолжить работу.
В данном коде:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
канал c создан без буфера, значит операция отправки (c <-) и получение (<-c) должны происходить одновременно.
Пояснение:
- Горутинa
go fmt.Println(<-c)пытается получить значение из каналаc. - Главная горутина пытается отправить значение
"Hello World!"в каналc.
Однако, из-за того, что fmt.Println(<-c) запускается в отдельной горутине, а отправка происходит в главной, возможна ситуация, когда горутина для чтения ещё не готова принять данные, и главная горутина блокируется на отправке.
В итоге обе горутины блокируются: одна ждёт отправки, другая — получения, но ни одна не может продолжить — возникает дедлок.
Чтобы исправить, можно:
- Сделать канал буферизированным, например
c := make(chan string, 1), чтобы отправка не блокировалась. - Или поменять порядок операций, чтобы сначала отправить, а потом читать.
Пример с буфером:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Теперь программа выполнится без дедлока.