clear name

This commit is contained in:
dreddsa5dies
2022-03-19 11:53:23 +03:00
parent 83845897e7
commit 5c2afce6fd

View File

@@ -1,92 +1,92 @@
## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone ## Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone
### <a name="1"></a> Go императивный или декларативный? А в чем разница? ### 1. Go императивный или декларативный? А в чем разница?
В основном Императивный. В основном Императивный.
Разница в подходе: Разница в подходе:
- императивный - как сделать (прямо пошагово); - императивный - как сделать (прямо пошагово);
- декларативный - что сделать (итоговый результат). - декларативный - что сделать (итоговый результат).
### <a name="2"></a> Что такое type switch? ### 2. Что такое type switch?
Сравнение типов переменной, а не ее значений. Сравнение типов переменной, а не ее значений.
### <a name="3"></a> Как сообщить компилятору, что наш тип реализует интерфейс? ### 3. Как сообщить компилятору, что наш тип реализует интерфейс?
Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс. Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс.
### <a name="4"></a> Как работает append? ### 4. Как работает append?
Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
### <a name="5"></a> Какое у slice zero value? Какие операции над ним возможны? ### 5. Какое у slice zero value? Какие операции над ним возможны?
Zero value у slice == nil Zero value у slice == nil
Возможные операции: len, cap, append. Возможные операции: len, cap, append.
### <a name="6"></a> Как устроен тип map? ### 6. Как устроен тип map?
Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map ссылочный тип и мало объявить переменную, надо ее проинициализировать. Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map ссылочный тип и мало объявить переменную, надо ее проинициализировать.
### <a name="7"></a> Каков порядок перебора map? ### 7. Каков порядок перебора map?
Случайным образом. Случайным образом.
### <a name="8"></a> Что будет, если читать из закрытого канала? ### 8. Что будет, если читать из закрытого канала?
Вернется нулевое значение. Вернется нулевое значение.
### <a name="9"></a> Что будет, если писать в закрытый канал? ### 9. Что будет, если писать в закрытый канал?
Произойдет вызов panic. Произойдет вызов panic.
### <a name="10"></a> Как вы отсортируете массив структур по алфавиту по полю Name? ### 10. Как вы отсортируете массив структур по алфавиту по полю Name?
С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс. С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс.
```go ```go
slice := array[:] slice := array[:]
``` ```
### <a name="11"></a> Что такое сериализация? Зачем она нужна? ### 11. Что такое сериализация? Зачем она нужна?
Сериализация это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск. Сериализация это преобразование объекта в какой-либо формат с тем, чтобы потом можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. Или сохранения в файл на диск.
### <a name="12"></a> Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? ### 12. Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?
Тут каждый считает сам. Попробуйте с таймингом (засеките время). Тут каждый считает сам. Попробуйте с таймингом (засеките время).
### <a name="13"></a> Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? ### 13. Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?
Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие. Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие.
### <a name="14"></a> Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? ### 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. [Обработка ошибок в Go 1.13](https://habr.com/ru/company/vk/blog/473658/). Вкратце: Go обрабатывает ошибки как значения. В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf.
### <a name="15"></a> Главный недостаток стандартного логгера? ### 15. Главный недостаток стандартного логгера?
Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog. Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog.
### <a name="16"></a> Есть ли для Go хороший orm? Ответ обоснуйте. ### 16. Есть ли для Go хороший orm? Ответ обоснуйте.
Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки. Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки.
### <a name="17"></a> Какой у вас любимый линтер? ### 17. Какой у вас любимый линтер?
Go vet + golint Go vet + golint
### <a name="18"></a> Можно ли использовать один и тот же буфер []byte в нескольких горутинах? ### 18. Можно ли использовать один и тот же буфер []byte в нескольких горутинах?
Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы. Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы.
### <a name="19"></a> Какие типы мьютексов предоставляет stdlib? ### 19. Какие типы мьютексов предоставляет stdlib?
В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов: В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов:
- sync.Mutex - блокирует и снимает блокировку; - sync.Mutex - блокирует и снимает блокировку;
- sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение; - sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение;
- отдельно стоит упомянуть sync.Map - вид мьютекса для мап. - отдельно стоит упомянуть sync.Map - вид мьютекса для мап.
### <a name="20"></a> Что такое lock-free структуры данных, и есть ли в Go такие? ### 20. Что такое lock-free структуры данных, и есть ли в Go такие?
Синхронизация это узкое место параллельных программ. Распараллеливая алгоритмы, мы работаем с последовательными структурами данных, обеспечивая их работу примитивами синхронизации критическими секциями, мьютексами, условными переменными (condvar); в результате мы выстраиваем все наши потоки в очередь на доступ к структуре данных, тем самым убивая параллельность. Синхронизация это узкое место параллельных программ. Распараллеливая алгоритмы, мы работаем с последовательными структурами данных, обеспечивая их работу примитивами синхронизации критическими секциями, мьютексами, условными переменными (condvar); в результате мы выстраиваем все наши потоки в очередь на доступ к структуре данных, тем самым убивая параллельность.
@@ -100,30 +100,30 @@ Lock-free структуры данных - не требующие внешне
В Go есть sync.Map и пакет atomic. Но с точки зрения указанных определений, а также реализации данных пакетов - это не чистый lock-free, это просто абстрактная реализация этой модели. В Go есть sync.Map и пакет atomic. Но с точки зрения указанных определений, а также реализации данных пакетов - это не чистый lock-free, это просто абстрактная реализация этой модели.
### <a name="21"></a> Способы поиска проблем производительности на проде? ### 21. Способы поиска проблем производительности на проде?
Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д. Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д.
### <a name="22"></a> Стандартный набор метрик prometheus в Go-программе? ### 22. Стандартный набор метрик prometheus в Go-программе?
### <a name="23"></a> Как встроить стандартный профайлер в свое приложение? ### 23. Как встроить стандартный профайлер в свое приложение?
### <a name="24"></a> Overhead от стандартного профайлера? ### 24. Overhead от стандартного профайлера?
### <a name="25"></a> Почему встраивание не наследование? ### 25. Почему встраивание не наследование?
Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov). Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила [Барбара Лисков](https://en.wikipedia.org/wiki/Barbara_Liskov).
При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует. При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует.
### <a name="26"></a> Какие средства обобщенного программирования есть в Go? ### 26. Какие средства обобщенного программирования есть в Go?
Обобщенное программирование это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18. Обобщенное программирование это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18.
### <a name="27"></a> Какие технологические преимущества языка Go вы можете назвать? ### 27. Какие технологические преимущества языка Go вы можете назвать?
- Параллелизм - Параллелизм
- Кроссплатформенность - Кроссплатформенность
@@ -137,7 +137,7 @@ Lock-free структуры данных - не требующие внешне
- Open Source - Open Source
- Обаятельный талисман - Обаятельный талисман
### <a name="28"></a> Какие технологические недостатки языка Go вы можете назвать? ### 28. Какие технологические недостатки языка Go вы можете назвать?
- быстрый, да не такой как C, C++ - быстрый, да не такой как C, C++
- нет ООП - нет ООП