Назад к вопросам
Senior
4
package main import ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Exit!") } fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program exited: status 2.
Компании, где спрашивали
Wildberries & Russ Bank
Ответ от нейросети
sobes.tech AI
В данном коде возникает дедлок из-за порядка операций с каналом и горутиной.
Разбор:
- Канал
cсоздан с буфером на 1 элемент. - Запускается горутина, которая пытается прочитать из канала:
<-c. - Главная горутина пытается отправить в канал строку
c <- "Hello World!".
Проблема в том, что горутина, которая читает из канала, блокируется на операции чтения, ожидая данные. Однако, главная горутина пытается отправить данные в канал после запуска горутины. Но из-за того, что горутина чтения не успевает принять данные, и главный поток блокируется на отправке, возникает дедлок.
Чтобы исправить ошибку, нужно поменять порядок операций или использовать буферизированный канал правильно. Например, можно сначала отправить данные в канал, а потом запускать горутину, которая их читает:
package main
import (
"fmt"
)
func main() {
c := make(chan string, 1)
c <- "Hello World!"
go fmt.Println(<-c)
fmt.Println("Exit!")
}
Или использовать неблокирующую отправку и чтение, чтобы избежать дедлока.