Go: чтение из канала в аргументе вызова с go

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

Условие

package main

import ( "fmt" )

func main() { c := make(chan string)

go fmt.Println(<-c)

c <- "Hello World!"

fmt.Println("Exit!")

}

Ответ

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

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

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

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

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

Hello World!
Exit!

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

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

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее