Sobes.tech
Назад к вопросам
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!")

Теперь программа выполнится без дедлока.