Files
go-interview/docs/GOLANG.md
Andrey Kapitonov c617ab9c93 Added QA
2020-06-01 17:10:22 +03:00

2.5 KiB
Raw Blame History

Вопросы по языку Golang

8. Как задать направление канала?

Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например:

func f(c chan<- string)

и канал c будет только отправлять сообщение. Попытка получить сообщение из канала c вызовет ошибку компилирования. Также мы можем изменить функцию f:

func f(c <-chan string)

Существуют и двунаправленные каналы, которые могут быть переданы в функцию, принимающую только принимающие или отправляющие каналы. Но только отправляющие или принимающие каналы не могут быть переданы в функцию, требующую двунаправленного канала!

9. Напишите собственную функцию Sleep, используя time.After

func sleep(s int) {
  <- time.After(time.Second * time.Duration(s)):
}

10. Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?

При инициализации канала можно использовать второй параметр:

c := make(chan int, 1)

и мы получим буферизированный канал с ёмкостью 1. Обычно каналы работают синхронно - каждая из сторон ждёт, когда другая сможет получить или передать сообщение. Но буферизованный канал работает асинхронно — получение или отправка сообщения не заставляют стороны останавливаться. Но канал теряет пропускную способность, когда он занят, в данном случае, если мы отправим в канал 1 сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не будет получено.