mirror of
https://github.com/goavengers/go-interview.git
synced 2026-02-04 12:46:20 +00:00
110 lines
7.1 KiB
Go
110 lines
7.1 KiB
Go
## <a name="podolsky"></a> Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
|
||
|
||
### <a name="1"></a> Go — императивный или декларативный? А в чем разница?
|
||
|
||
В основном Императивный.
|
||
Разница в подходе:
|
||
- императивный - как сделать (прямо пошагово);
|
||
- декларативный - что сделать (итоговый результат).
|
||
|
||
### <a name="2"></a> Что такое type switch?
|
||
|
||
Сравнение типов переменной, а не ее значений.
|
||
|
||
### <a name="3"></a> Как сообщить компилятору, что наш тип реализует интерфейс?
|
||
|
||
Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс.
|
||
|
||
### <a name="4"></a> Как работает append?
|
||
|
||
Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
|
||
|
||
### <a name="5"></a> Какое у slice zero value? Какие операции над ним возможны?
|
||
|
||
Zero value у slice == nil
|
||
Возможные операции: len, cap, append.
|
||
|
||
### <a name="6"></a> Как устроен тип map?
|
||
|
||
Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать.
|
||
|
||
### <a name="7"></a> Каков порядок перебора map?
|
||
|
||
Случайным образом.
|
||
|
||
### <a name="8"></a> Что будет, если читать из закрытого канала?
|
||
|
||
Вернется нулевое значение.
|
||
|
||
### <a name="9"></a> Что будет, если писать в закрытый канал?
|
||
|
||
Произойдет вызов panic.
|
||
|
||
### <a name="10"></a> Как вы отсортируете массив структур по алфавиту по полю Name?
|
||
|
||
С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс.
|
||
```go
|
||
slice := array[:]
|
||
```
|
||
|
||
### <a name="11"></a> Что такое сериализация? Зачем она нужна?
|
||
|
||
Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом tuj можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети.
|
||
|
||
### <a name="12"></a> Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
|
||
|
||
Тут каждый считает сам. Попробуйте с таймингом (засеките время).
|
||
|
||
### <a name="13"></a> Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
|
||
|
||
Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие.
|
||
|
||
### <a name="14"></a> Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?
|
||
|
||
|
||
|
||
### <a name="15"></a> Главный недостаток стандартного логгера?
|
||
|
||
|
||
### <a name="16"></a> Есть ли для Go хороший orm? Ответ обоснуйте.
|
||
|
||
Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки.
|
||
|
||
### <a name="17"></a> Какой у вас любимый линтер?
|
||
|
||
Go vet + golint
|
||
|
||
### <a name="18"></a> Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
|
||
|
||
|
||
### <a name="19"></a> Какие типы мьютексов предоставляет stdlib?
|
||
|
||
|
||
### <a name="20"></a> Что такое lock-free структуры данных, и есть ли в Go такие?
|
||
|
||
|
||
### <a name="21"></a> Способы поиска проблем производительности на проде?
|
||
|
||
|
||
### <a name="22"></a> Стандартный набор метрик prometheus в Go-программе?
|
||
|
||
|
||
### <a name="23"></a> Как встроить стандартный профайлер в свое приложение?
|
||
|
||
|
||
### <a name="24"></a> Overhead от стандартного профайлера?
|
||
|
||
|
||
### <a name="25"></a> Почему встраивание — не наследование?
|
||
|
||
|
||
### <a name="26"></a> Какие средства обобщенного программирования есть в Go?
|
||
|
||
Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18.
|
||
|
||
### <a name="27"></a> Какие технологические преимущества языка Go вы можете назвать?
|
||
|
||
|
||
### <a name="28"></a> Какие технологические недостатки языка Go вы можете назвать?
|
||
|