Sobes.tech
Back to questions
Senior
3

package main import ( "fmt" ) func main() { c := make(chan string, 1) 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.

Companies where asked
Wildberries & Russ Bank

Answer from AI

sobes.tech AI

В данном коде возникает дедлок из-за порядка операций с каналом и горутиной.

Разбор:

  • Канал c создан с буфером на 1 элемент.
  • Запускается горутина, которая пытается прочитать из канала: <-c.
  • Главная горутина пытается отправить в канал строку c <- "Hello World!".

Проблема в том, что горутина, которая читает из канала, блокируется на операции чтения, ожидая данные. Однако, главная горутина пытается отправить данные в канал после запуска горутины. Но из-за того, что горутина чтения не успевает принять данные, и главный поток блокируется на отправке, возникает дедлок.

Чтобы исправить ошибку, нужно поменять порядок операций или использовать буферизированный канал правильно. Например, можно сначала отправить данные в канал, а потом запускать горутину, которая их читает:

package main

import (
	"fmt"
)

func main() {
	c := make(chan string, 1)

	c <- "Hello World!"
	go fmt.Println(<-c)

	fmt.Println("Exit!")
}

Или использовать неблокирующую отправку и чтение, чтобы избежать дедлока.