From c617ab9c93de1edde628d57deb0b40d5f0317e53 Mon Sep 17 00:00:00 2001 From: Andrey Kapitonov Date: Mon, 1 Jun 2020 17:10:22 +0300 Subject: [PATCH] Added QA --- docs/GOLANG.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/GOLANG.md b/docs/GOLANG.md index 9acf95b..4c79f55 100644 --- a/docs/GOLANG.md +++ b/docs/GOLANG.md @@ -1 +1,35 @@ -### Вопросы по языку Golang \ No newline at end of file +## Вопросы по языку Golang + +### 8. Как задать направление канала? + +Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например: + +```go +func f(c chan<- string) +``` + +и канал `c` будет только отправлять сообщение. Попытка получить сообщение из канала c вызовет ошибку компилирования. Также мы можем изменить функцию `f`: + +```go +func f(c <-chan string) +``` + +Существуют и двунаправленные каналы, которые могут быть переданы в функцию, принимающую только принимающие или отправляющие каналы. Но только отправляющие или принимающие каналы не могут быть переданы в функцию, требующую двунаправленного канала! + +### 9. Напишите собственную функцию Sleep, используя time.After + +```go +func sleep(s int) { + <- time.After(time.Second * time.Duration(s)): +} +``` + +### 10. Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений? + +При инициализации канала можно использовать второй параметр: + +```go +c := make(chan int, 1) +``` + +и мы получим буферизированный канал с ёмкостью __1__. Обычно каналы работают синхронно - каждая из сторон ждёт, когда другая сможет получить или передать сообщение. Но буферизованный канал работает асинхронно — получение или отправка сообщения не заставляют стороны останавливаться. Но канал теряет пропускную способность, когда он занят, в данном случае, если мы отправим в канал __1__ сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не будет получено.