mirror of
https://github.com/goavengers/go-interview.git
synced 2026-02-04 12:46:20 +00:00
102 lines
4.2 KiB
Go
102 lines
4.2 KiB
Go
## <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>
|