This commit is contained in:
Andrey Kapitonov
2020-06-01 17:10:22 +03:00
committed by GitHub
parent 64c0bf7fbb
commit c617ab9c93

View File

@@ -1 +1,35 @@
### <a name="golang_questions"></a>Вопросы по языку Golang ## <a name="golang_questions"></a> Вопросы по языку Golang
### <a name="8"></a> 8. Как задать направление канала?
Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например:
```go
func f(c chan<- string)
```
и канал `c` будет только отправлять сообщение. Попытка получить сообщение из канала c вызовет ошибку компилирования. Также мы можем изменить функцию `f`:
```go
func f(c <-chan string)
```
Существуют и двунаправленные каналы, которые могут быть переданы в функцию, принимающую только принимающие или отправляющие каналы. Но только отправляющие или принимающие каналы не могут быть переданы в функцию, требующую двунаправленного канала!
### <a name="9"></a> 9. Напишите собственную функцию Sleep, используя time.After
```go
func sleep(s int) {
<- time.After(time.Second * time.Duration(s)):
}
```
### <a name="10"></a> 10. Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?
При инициализации канала можно использовать второй параметр:
```go
c := make(chan int, 1)
```
и мы получим буферизированный канал с ёмкостью __1__. Обычно каналы работают синхронно - каждая из сторон ждёт, когда другая сможет получить или передать сообщение. Но буферизованный канал работает асинхронно получение или отправка сообщения не заставляют стороны останавливаться. Но канал теряет пропускную способность, когда он занят, в данном случае, если мы отправим в канал __1__ сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не будет получено.