Sobes.tech
Senior

pakiet główny import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Witaj świecie!" fmt.Println("Wyjście!") } błąd krytyczny: wszystkie goroutine są uśpione - deadlock! goroutine 1 [odbiór kanału]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program zakończył się: status 2.

sobes.tech AI

Odpowiedź od AI

Błąd fatal error: all goroutines are asleep - deadlock! występuje, gdy wszystkie goroutines są zablokowane i żadna nie może kontynuować.

W tym kodzie:

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

Kanał c jest tworzony bez bufora, więc operacje wysyłania (c <-) i odbierania (<-c) muszą odbywać się jednocześnie.

Wyjaśnienie:

  • Goroutine go fmt.Println(<-c) próbuje odebrać wartość z kanału c.
  • Główna goroutine próbuje wysłać wartość "Hello World!" do kanału c.

Jednak, ponieważ fmt.Println(<-c) jest uruchamiana w osobnej goroutine, a wysyłanie odbywa się w głównej, może się zdarzyć, że goroutine odczytująca jeszcze nie jest gotowa na przyjęcie danych, a główna goroutine blokuje się na wysyłce.

W efekcie obie goroutines blokują się: jedna czeka na wysłanie, druga na odebranie, ale żadna nie może kontynuować — dochodzi do deadlocka.

Aby to naprawić, można:

  • Używać kanału z buforem, np. c := make(chan string, 1), aby wysyłka nie blokowała.
  • Lub zmienić kolejność operacji, najpierw wysłać, potem odczytać.

Przykład z buforem:

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

Teraz program będzie działał bez deadlocka.