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łuc. - Główna goroutine próbuje wysłać wartość
"Hello World!"do kanałuc.
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.