Тест: Golang interview questions


Список вопросов


1. Go — императивный или декларативный?

1) императивный
2) декларативный
3) как сделать (прямо пошагово)
4) что сделать (итоговый результат)

2. Что такое type switch?

1) Сравнение типов значений.
2) Сравнение типов переменной
3) Cравнение типов структуры
4) Сравнение типов интерфейса
5) Сравнение типов метода

3. Как сообщить компилятору, что наш тип реализует интерфейс?

1) Интерфейс имеет глобальную видимость
2) Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс.
3) Интерфейс имеет локальную видимость

4. Как работает append в слайсе?

1) Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
2) Если capacity исходного массива недостаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются
3) Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные не копируются

5. Какое у slice zero value?

1) Zero value у slice == nil

6. Какие операции над slice возможны?

1) len
2) cap
3) append

7. Как устроен тип map?

1) Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск.
2) Map in Go не упорядоченная. Место поиска определяется рандомно.
3) Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0.
4) Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать.

8. Каков порядок перебора map?

1) C начала до конца
2) Случайным образом
3) От конца до начала

9. Что будет, если читать из закрытого канала?

1) deadlock
2) Вернется нулевое значение
3) panica

10. Что будет, если писать в закрытый канал?

1) deadlock
2) panic
3) ошибка

11. Как вы отсортируете массив структур по алфавиту по полю Name?

1) С помощью функции sort.Slice
2) С помощью функции sort.SliceStable
3) С помощью функции sort.String
4) Для этого сначала конвертируем массив в слайс.

12. Что такое сериализация?

1) Добавление серии элементу
2) Сериализация — это преобразование объекта в какой-либо формат
3) Удаление недействительного метода

13. Зачем нужна сериализация?

1) Для преобразования объекта
2) Для передачи как набора байт по сети
3) Для сохранения в файл на диск.

14. Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется?

1) Небольшое копирование хуже, чем большая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов
2) Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов
3) Большое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов

15. Почему небольшое копирование лучше, чем небольшая зависимость .

1) Потому что будет паника
2) Потому что интерфейс вернёт nil
3) Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие.

16. Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net?

1) Go обрабатывает ошибки как значения
2) Go обрабатывает ошибки как структуры
3) Go обрабатывает ошибки как функции

17. Как это надо делать в современном Go?

1) С помощью if err != nil
2) С помощью recover()
3) В версии 1.13 добавлены метод Unwrap, исследование ошибок с помощью Is и As, упаковка ошибок с помощью %w для fmt.Errorf.

18. Главный недостаток стандартного логгера?

1) Стандартными логгерами не являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog.
2) Стандартными логгерами являются: log и log/syslog. Однако в них не реализована идея разделения сообщений по уровням важности (информационные, ошибки, отладочная информация, различные дампы) и сопутствующие плюшки (цвет сообщений и т.д.). Такими пакетами являются: logrus, glog.
3) Стандартный логгер отсутствует после версии 1.15

19. Есть ли для Go хороший orm? Ответ обоснуйте.

1) Что такое orm
2) Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки.
3) Хороший orm в Golang отсутствует

20. Какой у вас любимый линтер?

1) golint
2) Golintervet
3) Go vet

21. Можно ли использовать один и тот же буфер []byte в нескольких горутинах?

1) Можно
2) Зачем может понадобиться использовать один и тот же буфер []byte в нескольких горутинах параллельно? Не за чем, для этого существуют каналы. Но даже если такая задача стоит, то в этом случае - это общие данные и тут необходимо исключить возможность одновременного выполнения нескольких операций записи. Например используя мьютексы.
3) Нельзя

22. Какие типы мьютексов предоставляет stdlib?

1) В стандартной библиотеке есть пакет sync. Он предоставляет следующие типы мьютексов:
2) sync.Mutex - блокирует и снимает блокировку;
3) sync.RWMutex - тоже самое, но есть отдельно блокировка на чтение/запись и отдельно на чтение;
4) отдельно стоит упомянуть sync.Map - вид мьютекса для мап.

23. Способы поиска проблем производительности на проде?

1) Не знаю что это такое
2) Анализ метрик (Prometheus и Grafana), кода (pprof) - это про продукт. Анализ загрузки сети (интерфейсы маршрутизаторов, МСЭ и т.д.), соединений (tshark, wireshark) - это про сеть. И железо - логи ОС и т.д.
3) Нет подходящих способов в вариантах ответа

24. Почему встраивание — не наследование?

1) Встраивание это инкапсуляция
2) Буква L в аббревиатуре SOLID обозначает Liskov Substitution - объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Этот принцип предложила Барбара Лисков. При использовании наследования объект представляет собой наследуемый тип, тем самым наследуя функциональность, которой делятся родители. При использовании композиции у объекта есть все признаки, что предоставляют необходимую для объекта функциональность. Другой объект может повторно использовать некоторые из данных функциональностей, однако тип родителя или иерархия, восходящая к нему, отсутствует.
3) Встраивание это полиморфизм

25. Какие средства обобщенного программирования есть в Go?

1) В Golang это не реализовано
2) Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. Дженерики будут с версии 1.18.
3) Нет верного ответа

26. Какие технологические преимущества языка Go вы можете назвать? Простой и понятный синтаксис Open Source Обаятельный талисман

1) Параллелизм
2) Кроссплатформенность
3) Скорость и компиляция
4) Статическая типизация
5) Богатая стандартная библиотека
6) Возможность писать в функциональном стиле
7) Нет ООП
8) Авторитетные отцы-основатели и сильное комьюнити
9) Простой и понятный синтаксис
10) Open Source

27. Какие технологические недостатки языка Go вы можете назвать?

1) быстрый, да не такой как C, C++
2) нет ООП
3) всех бесят if err
4) кто-то говорит про дженерики, но это лично его мнение