Sobes.tech
Senior

ana paket içe aktar ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Merhaba Dünya!" fmt.Println("Çıkış!") } ölüm hatası: tüm goroutine'ler uyuyor - deadlock! goroutine 1 [kanal alımı]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program çıktı: durum 2.

sobes.tech yapay zeka

AI'dan gelen yanıt

Hata fatal error: all goroutines are asleep - deadlock! tüm goroutine'ler kilitlendiğinde ve hiçbiri devam edemediğinde oluşur.

Bu kodda:

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

Kanal c tamponsuz olarak oluşturulmuştur, bu nedenle gönderme (c <-) ve alma (<-c) işlemleri aynı anda gerçekleşmelidir.

Açıklama:

  • go fmt.Println(<-c) goroutine'u, kanaldan değer almaya çalışır.
  • Ana goroutine, "Hello World!" değerini kanala göndermeye çalışır.

Ancak, fmt.Println(<-c) ayrı bir goroutine'da çalıştığı ve gönderme ana goroutine'da gerçekleştiği için, okuma goroutine'u henüz hazır olmayabilir ve ana goroutine gönderme sırasında bloke olur.

Sonuç olarak, her iki goroutine de bloke olur: biri göndermeyi bekler, diğeri almayı, ancak hiçbiri devam edemez — bu bir deadlock'e yol açar.

Bunu düzeltmek için:

  • Kanalı tamponlu yapabilirsiniz, örneğin c := make(chan string, 1), böylece gönderme bloke olmaz.
  • Veya işlemlerin sırasını değiştirerek önce gönderip sonra okumayı yapabilirsiniz.

Tamponlu örnek:

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

Artık program deadlock olmadan çalışacaktır.