Sobes.tech
Назад к вопросам
Senior
3

package main import ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Exit!") }

Компании, где спрашивали
Wildberries & Russ Bank

Ответ от нейросети

sobes.tech AI

В данном коде создаётся канал строк c := make(chan string), который по умолчанию является небуферизованным.

Затем запускается горутина go fmt.Println(<-c), которая пытается прочитать из канала и вывести полученную строку.

После этого в основной горутине в канал отправляется строка c <- "Hello World!".

Поскольку канал небуферизованный, операция отправки блокируется до тех пор, пока другая горутина не прочитает значение. В данном случае горутина, которая читает из канала, уже запущена и ожидает данные, поэтому обмен происходит корректно.

В итоге вывод будет:

Hello World!
Exit!

Порядок гарантируется тем, что основная горутина блокируется на отправке в канал, пока горутина-получатель не прочитает значение. После этого основной поток продолжит выполнение и выведет "Exit!".

Если бы канал был буферизован, например make(chan string, 1), то горутина с чтением могла бы запуститься позже, но в данном случае синхронизация происходит через небуферизованный канал.