Sobes.tech
Senior

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 Kanal c zu empfangen.
  • Die Haupt-Goroutine versucht, den Wert "Hello World!" an den Kanal c zu 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.