Files
go-interview/docs/PODOLSKY.md
2022-03-14 18:18:36 +03:00

113 lines
8.3 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="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> Почему встраивание не наследование?
Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov).
При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует.
### <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 вы можете назвать?