Sobes.tech
Senior

основен пакет внос ( "fmt" ) функция main() { c := make(chan string) go fmt.Println(<-c) c <- "Здравей свят!" fmt.Println("Изход!") } фатална грешка: всички горутини спят - deadlock! goroutine 1 [приемане на канал]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Програмата е излязла: статус 2.

sobes.tech AI

Отговор от 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) трябва да се случват едновременно.

Обяснение:

  • Горутината go fmt.Println(<-c) се опитва да получи стойност от канала c.
  • Основната горутина се опитва да изпрати стойността "Hello World!" към канала c.

Обаче, тъй като fmt.Println(<-c) работи в отделна горутина, а изпращането се случва в основната, може да се случи така, че горутината за четене още да не е готова да приеме данните, и основната горутина да блокира при изпращането.

В резултат, и двете горутини се блокират: едната чака да изпрати, другата да приеме, но никоя не може да продължи — възниква deadlock.

За да се оправи, може:

  • Да се направи канал с буфер, например c := make(chan string, 1), така че изпращането да не блокира.
  • Или да се промени редът на операциите, първо да се изпрати, после да се прочете.

Пример с буфер:

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

Сега програмата ще работи без deadlock.