Files
go-interview/docs/GOLANG.md
Andrey Kapitonov 28809fb56a Added question 14
2020-06-12 22:05:48 +03:00

102 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## <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__ сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не будет получено.
### <a name="11"></a> 11. Напишите программу, которая меняет местами два числа (x := 1; y := 2; swap(&x, &y) должно дать x=2 и y=1)
```go
func main() {
x := 1
y := 2
swap(&x, &y)
fmt.Println(x, y)
}
func swap(x, y *int) {
*x, *y = *y, *x
}
```
### <a name="12"></a> 12. Какое будет значение у переменной x после выполнения программы?
```go
func square(x *float64) {
*x = *x * *x
}
func main() {
x := 1.5
square(&x)
fmt.Println(x)
}
```
### <a name="13"></a> 13. Какое значение примет выражение (true && false) || (false && true) || !(false && false)?
```go
fmt.Println((true && false) || (false && true) || !(false && false)) // true
```
### <a name="14"></a> 14. Мы знаем, что в десятичной системе самое большое число из одной цифры - это 9, а из двух - 99. В бинарной системе самое большое число из двух цифр это 11 (3), самое большое число из трех цифр это 111 (7) и самое большое число из 4 цифр это 1111 (15). Вопрос: каково самое большое число из 8 цифр? (Подсказка: 101-1=9 и 102-1=99)
### <a name="15"></a> 15. Что выведет следующая программа?
```go
package main
import "fmt"
func main() {
i := 65
fmt.Println(string(i))
}
```
**Варианты:**
1. A
2. 65
3. Ошибка компиляции
4. Нет правильного ответа
5. Я не знаю
<details>
<summary>Ответ</summary>
**Ответ:** А
</details>