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.