Hauptpaket importiere ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hallo Welt!" fmt.Println("Beenden!") } fataler Fehler: alle Goroutinen schlafen - Deadlock! goroutine 1 [Kanal empfangen]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programm beendet: Status 2.
sobes.tech KI
Antwort von AI
Der Fehler fatal error: all goroutines are asleep - deadlock! tritt auf, wenn alle Goroutines blockiert sind und keine fortfahren kann.
In diesem Code:
c := make(chan string)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Wird der Kanal c ohne Puffer erstellt, was bedeutet, dass Sende- (c <-) und Empfangsoperationen (<-c) gleichzeitig stattfinden müssen.
Erläuterung:
- Die Goroutine
go fmt.Println(<-c)versucht, einen Wert vom Kanalczu empfangen. - Die Haupt-Goroutine versucht, den Wert
"Hello World!"an den Kanalczu senden.
Da fmt.Println(<-c) in einer separaten Goroutine läuft und der Versand in der Haupt-Goroutine erfolgt, kann es passieren, dass die Lesegoroutine noch nicht bereit ist, Daten zu empfangen, und die Haupt-Goroutine beim Senden blockiert.
Folge: Beide Goroutines blockieren: eine wartet auf das Senden, die andere auf das Empfangen, aber keine kann fortfahren — es entsteht ein Deadlock.
Zur Behebung kann man:
- Den Kanal gepuffert machen, z.B.
c := make(chan string, 1), damit das Senden nicht blockiert. - Oder die Reihenfolge der Operationen ändern, zuerst senden, dann lesen.
Beispiel mit Puffer:
c := make(chan string, 1)
go fmt.Println(<-c)
c <- "Hello World!"
fmt.Println("Exit!")
Jetzt läuft das Programm ohne Deadlock.