mirror of
https://github.com/goavengers/go-interview.git
synced 2026-02-04 04:36:19 +00:00
64
README.md
64
README.md
@@ -54,13 +54,7 @@
|
||||
- [Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?](docs/golang#1)
|
||||
- [Вытекающий вопрос — как эффективно склеивать множество строк?](docs/golang#2)
|
||||
- Что будет происходить при конкурентной записи в map? Как можно решить эту проблему?
|
||||
- Расскажите о ООП в Golang.
|
||||
- В чем различия goroutine от потока системы?
|
||||
- Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока?
|
||||
- [Как задать направление канала?](docs/golang#8)
|
||||
- [Напишите собственную функцию Sleep, используя time.After](docs/golang#9)
|
||||
- [Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?](docs/golang#10)
|
||||
- [Напишите программу, которая меняет местами два числа (x := 1; y := 2; swap(&x, &y) должно дать x=2 и y=1)](docs/golang#11)
|
||||
- Расскажите о ООП в Golang.#1
|
||||
- [Какое будет значение у переменной x после выполнения программы?](docs/golang#12)
|
||||
- [Какое значение примет выражение (true && false) || (false && true) || !(false && false)?](docs/golang#13)
|
||||
- [Мы знаем, что в десятичной системе самое большое число из одной цифры - это 9, а из двух - 99. В бинарной системе самое большое число из двух цифр это 11 (3), самое большое число из трех цифр это 111 (7) и самое большое число из 4 цифр это 1111 (15). Вопрос: каково самое большое число из 8 цифр? (Подсказка: 101-1=9 и 102-1=99)](docs/golang#14)
|
||||
@@ -81,34 +75,34 @@
|
||||
- Почему в TDD тесты пишутся прежде кода?
|
||||
- Если у вашего кода плохая организация, как вы это поймёте?
|
||||
9. [Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone](docs/podolsky/)
|
||||
- [Go — императивный или декларативный? А в чем разница?](docs/podolsky/)
|
||||
- [Что такое type switch?](docs/podolsky/)
|
||||
- [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/podolsky/)
|
||||
- [Как работает append?](docs/podolsky/)
|
||||
- [Какое у slice zero value? Какие операции над ним возможны?](docs/podolsky/)
|
||||
- [Как устроен тип map?](docs/podolsky/)
|
||||
- [Каков порядок перебора map?](docs/podolsky/)
|
||||
- [Что будет, если читать из закрытого канала?](docs/podolsky/)
|
||||
- [Что будет, если писать в закрытый канал?](docs/podolsky/)
|
||||
- [Как вы отсортируете массив структур по алфавиту по полю Name?](docs/podolsky/)
|
||||
- [Что такое сериализация? Зачем она нужна?](docs/podolsky/)
|
||||
- [Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?](docs/podolsky/)
|
||||
- [Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?](docs/podolsky/)
|
||||
- [Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?](docs/podolsky/)
|
||||
- [Главный недостаток стандартного логгера?](docs/podolsky/)
|
||||
- [Есть ли для Go хороший orm? Ответ обоснуйте.](docs/podolsky/)
|
||||
- [Какой у вас любимый линтер?](docs/podolsky/)
|
||||
- [Можно ли использовать один и тот же буфер []byte в нескольких горутинах?](docs/podolsky/)
|
||||
- [Какие типы мьютексов предоставляет stdlib?](docs/podolsky/)
|
||||
- [Что такое lock-free структуры данных, и есть ли в Go такие?](docs/podolsky/)
|
||||
- [Способы поиска проблем производительности на проде?](docs/podolsky/)
|
||||
- [Стандартный набор метрик prometheus в Go -программе?](docs/podolsky/)
|
||||
- [Как встроить стандартный профайлер в свое приложение?](docs/podolsky/)
|
||||
- [Overhead от стандартного профайлера?](docs/podolsky/)
|
||||
- [Почему встраивание — не наследование?](docs/podolsky/)
|
||||
- [Какие средства обобщенного программирования есть в Go?](docs/podolsky/)
|
||||
- [Какие технологические преимущества языка Go вы можете назвать?](docs/podolsky/)
|
||||
- [Какие технологические недостатки языка Go вы можете назвать?](docs/podolsky/)
|
||||
- [Go — императивный или декларативный? А в чем разница?](docs/podolsky#1)
|
||||
- [Что такое type switch?](docs/podolsky#2)
|
||||
- [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/podolsky#3)
|
||||
- [Как работает append?](docs/podolsky#4)
|
||||
- [Какое у slice zero value? Какие операции над ним возможны?](docs/podolsky#5)
|
||||
- [Как устроен тип map?](docs/podolsky#6)
|
||||
- [Каков порядок перебора map?](docs/podolsky#7)
|
||||
- [Что будет, если читать из закрытого канала?](docs/podolsky#8)
|
||||
- [Что будет, если писать в закрытый канал?](docs/podolsky#9)
|
||||
- [Как вы отсортируете массив структур по алфавиту по полю Name?](docs/podolsky#10)
|
||||
- [Что такое сериализация? Зачем она нужна?](docs/podolsky#11)
|
||||
- [Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?](docs/podolsky#12)
|
||||
- [Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?](docs/podolsky#13)
|
||||
- [Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?](docs/podolsky#14)
|
||||
- [Главный недостаток стандартного логгера?](docs/podolsky#15)
|
||||
- [Есть ли для Go хороший orm? Ответ обоснуйте.](docs/podolsky#16)
|
||||
- [Какой у вас любимый линтер?](docs/podolsky#17)
|
||||
- [Можно ли использовать один и тот же буфер []byte в нескольких горутинах?](docs/podolsky#18)
|
||||
- [Какие типы мьютексов предоставляет stdlib?](docs/podolsky#19)
|
||||
- [Что такое lock-free структуры данных, и есть ли в Go такие?](docs/podolsky#20)
|
||||
- [Способы поиска проблем производительности на проде?](docs/podolsky#21)
|
||||
- [Стандартный набор метрик prometheus в Go -программе?](docs/podolsky#22)
|
||||
- [Как встроить стандартный профайлер в свое приложение?](docs/podolsky#23)
|
||||
- [Overhead от стандартного профайлера?](docs/podolsky#24)
|
||||
- [Почему встраивание — не наследование?](docs/podolsky#25)
|
||||
- [Какие средства обобщенного программирования есть в Go?](docs/podolsky#26)
|
||||
- [Какие технологические преимущества языка Go вы можете назвать?](docs/podolsky#27)
|
||||
- [Какие технологические недостатки языка Go вы можете назвать?](docs/podolsky#28)
|
||||
10. [Популярные задачи на собеседованиях](docs/popular_tasks)
|
||||
- [На вход подаются два неупорядоченных слайса любой длины. Надо написать функцию, которая возвращает их пересечение](docs/popular_tasks#1)
|
||||
- [Написать генератор случайных чисел](docs/popular_tasks#2)
|
||||
|
||||
@@ -1,92 +1,92 @@
|
||||
## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
|
||||
## <a name="podolsky_questions"></a> Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
|
||||
|
||||
### 1. Go — императивный или декларативный? А в чем разница?
|
||||
### <a name="1"></a> 1. Go — императивный или декларативный? А в чем разница?
|
||||
|
||||
В основном Императивный.
|
||||
Разница в подходе:
|
||||
- императивный - как сделать (прямо пошагово);
|
||||
- декларативный - что сделать (итоговый результат).
|
||||
|
||||
### 2. Что такое type switch?
|
||||
### <a name="2"></a> 2. Что такое type switch?
|
||||
|
||||
Сравнение типов переменной, а не ее значений.
|
||||
|
||||
### 3. Как сообщить компилятору, что наш тип реализует интерфейс?
|
||||
### <a name="3"></a> 3. Как сообщить компилятору, что наш тип реализует интерфейс?
|
||||
|
||||
Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс.
|
||||
|
||||
### 4. Как работает append?
|
||||
### <a name="4"></a> 4. Как работает append?
|
||||
|
||||
Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
|
||||
|
||||
### 5. Какое у slice zero value? Какие операции над ним возможны?
|
||||
### <a name="5"></a> 5. Какое у slice zero value? Какие операции над ним возможны?
|
||||
|
||||
Zero value у slice == nil
|
||||
Возможные операции: len, cap, append.
|
||||
|
||||
### 6. Как устроен тип map?
|
||||
### <a name="6"></a> 6. Как устроен тип map?
|
||||
|
||||
Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать.
|
||||
|
||||
### 7. Каков порядок перебора map?
|
||||
### <a name="7"></a> 7. Каков порядок перебора map?
|
||||
|
||||
Случайным образом.
|
||||
|
||||
### 8. Что будет, если читать из закрытого канала?
|
||||
### <a name="8"></a> 8. Что будет, если читать из закрытого канала?
|
||||
|
||||
Вернется нулевое значение.
|
||||
|
||||
### 9. Что будет, если писать в закрытый канал?
|
||||
### <a name="9"></a> 9. Что будет, если писать в закрытый канал?
|
||||
|
||||
Произойдет вызов panic.
|
||||
|
||||
### 10. Как вы отсортируете массив структур по алфавиту по полю Name?
|
||||
### <a name="10"></a> 10. Как вы отсортируете массив структур по алфавиту по полю Name?
|
||||
|
||||
С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс.
|
||||
```go
|
||||
slice := array[:]
|
||||
```
|
||||
|
||||
### 11. Что такое сериализация? Зачем она нужна?
|
||||
### <a name="11"></a> 11. Что такое сериализация? Зачем она нужна?
|
||||
|
||||
Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск.
|
||||
|
||||
### 12. Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
|
||||
### <a name="12"></a> 12. Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
|
||||
|
||||
Тут каждый считает сам. Попробуйте с таймингом (засеките время).
|
||||
|
||||
### 13. Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
|
||||
### <a name="13"></a> 13. Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
|
||||
|
||||
Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие.
|
||||
|
||||
### 14. Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
|
||||
### <a name="14"></a> 14. Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
|
||||
|
||||
[Обработка ошибок в Go 1.13](https://habr.com/ru/company/vk/blog/473658/). Вкратце: Go обрабатывает ошибки как значения. В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf.
|
||||
|
||||
### 15. Главный недостаток стандартного логгера?
|
||||
### <a name="15"></a> 15. Главный недостаток стандартного логгера?
|
||||
|
||||
Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog.
|
||||
|
||||
### 16. Есть ли для Go хороший orm? Ответ обоснуйте.
|
||||
### <a name="16"></a> 16. Есть ли для Go хороший orm? Ответ обоснуйте.
|
||||
|
||||
Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки.
|
||||
|
||||
### 17. Какой у вас любимый линтер?
|
||||
### <a name="17"></a> 17. Какой у вас любимый линтер?
|
||||
|
||||
Go vet + golint
|
||||
|
||||
### 18. Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
|
||||
### <a name="18"></a> 18. Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
|
||||
|
||||
Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы.
|
||||
|
||||
### 19. Какие типы мьютексов предоставляет stdlib?
|
||||
### <a name="19"></a> 19. Какие типы мьютексов предоставляет stdlib?
|
||||
|
||||
В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов:
|
||||
- sync.Mutex - блокирует и снимает блокировку;
|
||||
- sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение;
|
||||
- отдельно стоит упомянуть sync.Map - вид мьютекса для мап.
|
||||
|
||||
### 20. Что такое lock-free структуры данных, и есть ли в Go такие?
|
||||
### <a name="20"></a> 20. Что такое lock-free структуры данных, и есть ли в Go такие?
|
||||
|
||||
Синхронизация – это узкое место параллельных программ. Распараллеливая алгоритмы, мы работаем с последовательными структурами данных, обеспечивая их работу примитивами синхронизации – критическими секциями, мьютексами, условными переменными (condvar); в результате мы выстраиваем все наши потоки в очередь на доступ к структуре данных, тем самым убивая параллельность.
|
||||
|
||||
@@ -100,30 +100,30 @@ Lock-free структуры данных - не требующие внешне
|
||||
|
||||
В Go есть sync.Map и пакет atomic. Но с точки зрения указанных определений, а также реализации данных пакетов - это не чистый lock-free, это просто абстрактная реализация этой модели.
|
||||
|
||||
### 21. Способы поиска проблем производительности на проде?
|
||||
### <a name="21"></a> 21. Способы поиска проблем производительности на проде?
|
||||
|
||||
Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д.
|
||||
|
||||
### 22. Стандартный набор метрик prometheus в Go-программе?
|
||||
### <a name="22"></a> 22. Стандартный набор метрик prometheus в Go-программе?
|
||||
|
||||
|
||||
### 23. Как встроить стандартный профайлер в свое приложение?
|
||||
### <a name="23"></a> 23. Как встроить стандартный профайлер в свое приложение?
|
||||
|
||||
|
||||
### 24. Overhead от стандартного профайлера?
|
||||
### <a name="24"></a> 24. Overhead от стандартного профайлера?
|
||||
|
||||
|
||||
### 25. Почему встраивание — не наследование?
|
||||
### <a name="25"></a> 25. Почему встраивание — не наследование?
|
||||
|
||||
Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov).
|
||||
|
||||
При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует.
|
||||
|
||||
### 26. Какие средства обобщенного программирования есть в Go?
|
||||
### <a name="26"></a> 26. Какие средства обобщенного программирования есть в Go?
|
||||
|
||||
Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18.
|
||||
|
||||
### 27. Какие технологические преимущества языка Go вы можете назвать?
|
||||
### <a name="27"></a> 27. Какие технологические преимущества языка Go вы можете назвать?
|
||||
|
||||
- Параллелизм
|
||||
- Кроссплатформенность
|
||||
@@ -137,7 +137,7 @@ Lock-free структуры данных - не требующие внешне
|
||||
- Open Source
|
||||
- Обаятельный талисман
|
||||
|
||||
### 28. Какие технологические недостатки языка Go вы можете назвать?
|
||||
### <a name="28"></a> 28. Какие технологические недостатки языка Go вы можете назвать?
|
||||
|
||||
- быстрый, да не такой как C, C++
|
||||
- нет ООП
|
||||
|
||||
Reference in New Issue
Block a user