## Вопросы по языку 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__ сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не будет получено. ### 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 } ``` ### 12. Какое будет значение у переменной x после выполнения программы? ```go func square(x *float64) { *x = *x * *x } func main() { x := 1.5 square(&x) fmt.Println(x) } ```
Ответ Ответ: 2.25
### 13. Какое значение примет выражение (true && false) || (false && true) || !(false && false)? ```go fmt.Println((true && false) || (false && true) || !(false && false)) ```
Ответ Ответ: true
### 14. Мы знаем, что в десятичной системе самое большое число из одной цифры - это 9, а из двух - 99. В бинарной системе самое большое число из двух цифр это 11 (3), самое большое число из трех цифр это 111 (7) и самое большое число из 4 цифр это 1111 (15). Вопрос: каково самое большое число из 8 цифр? (Подсказка: 101-1=9 и 102-1=99) ### 15. Что выведет следующая программа? ```go package main import "fmt" func main() { i := 65 fmt.Println(string(i)) } ``` **Варианты:** 1. A 2. 65 3. Ошибка компиляции 4. Нет правильного ответа 5. Я не знаю
Ответ Ответ: А
### 16. Что выведет следующая программа? ```go package main import "fmt" func main() { a := [5]int{1, 2, 3, 4, 5} t := a[3:4:4] fmt.Prinln(t[0]) } ``` **Варианты:** 1. 3 2. 4 3. Ошибка компиляции 4. Нет правильного ответа 5. Я не знаю
Ответ Ответ: 4
### 17.Как работает Garbage Collection в Go? `// todo` ### 18.Что такое interface, как они работают в Go? `// todo` ### 19.Что такое slice, как устроены и чем отличаются от массивов? `// todo` ### 20.Что такое len и capacity в slice Go? `// todo` ### 21.Возможно ли предугадать, что GC отработает за константное время N? `// todo` ### 22.Что будет, если создать канал и отправить туда запись, но у него нет читателей? `// todo`