Sobes.tech
Senior

hlavní balíček import ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Ahoj světe!" fmt.Println("Výstup!") } fatální chyba: všechny gorutiny jsou spící - deadlock! goroutine 1 [příjem kanálu]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Program ukončen: stav 2.

sobes.tech AI

Odpověď od 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!")
}

Или использовать неблокирующую отправку и чтение, чтобы избежать дедлока.