В данном коде создаётся канал строк c := make(chan string), который по умолчанию является небуферизованным.
Go: чтение из канала в аргументе вызова с go
В данном коде создаётся канал строк 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), то горутина с чтением могла бы запуститься позже, но в этом случае синхронизация происходит через небуферизованный канал.