Golang вопросы собеседований
13.5K subscribers
631 photos
3 videos
1 file
433 links
@notxxx1 - админ

@Golang_google - Golang для разработчиков

@itchannels_telegram - 🔥лучшие из ит

@golangl - chat

@golangtests - golang tests

@golang_jobsgo - go chat jobs

@ai_machinelearning_big_data - AI

@data_analysis_ml

РКН: clck.ru/3FmtKd
加入频道
Как найти максимальное число в массиве на Golang?

Ответ

Чтобы найти максимальное число в массиве, то можно воспользоваться несколькими путями в Golang:

Отсортировать массив и затем взять последний элемент массива
Использовать цикл: берем первый элемент как начальный и затем в цикле сравниваем и если больше, то записываем в максимально значение


@golang_interview
"Как преобразовать интерфейс к другому типу?"

Ответ
Интерфейс можно преобразовать в базовый тип значения (скастить). Для этого используется синтаксис, возвращающий две переменные, одна из которых булевая.

В случае, если не удалось скастить интерфейс, булевая переменная будет ложной, а переменная базового типа, к которому приводим интерфейс будет равна дефолтному значению этого типа.

@golang_interview
Реализуйте функцию SumOfSquares, получающую целое число c и возвращающую сумму всех квадратов между 1 и c. Вам потребуется использовать инструкции select, горутины и каналы.

Например, ввод 5 приведет к возвращению 55, потому что $1² + 2² + 3² + 4² + 5² = 55$.

Ответ :

Рассмотрим функцию SumOfSquares. Сначала на строке 4 мы объявляем переменную y, после чего переходим к циклу For-Select. В инструкциях select прописано два кейса.

case c <- (y*y): служит для отправки квадрата y по каналу c, который принимается в горутине, созданной в основной рутине.
case <-quit: служит для получения сообщения из основной рутины, которое вернется из функции.

@golang_interview - вопросы собеседованний Golang
Отформатируйте строку без ее вывода
Найдите самый простой способ отформатировать строку с переменными, не выводя значение.


Ответ

Легче всего это сделать с помощью fmt.Sprintf(), которая возвращает строку, не выводя ее на экран.


@golang_interview
Merge sort
Реализуйте конкурентное решение merge sort (сортировка слиянием), используя горутины и каналы.


В качестве опорной точки можно взять эту последовательную реализацию:

В начале при сортировке слиянием мы рекурсивно разделяем массив на right и left стороны и на строках 30-34 вызываем MergeSort для обеих сторон.

Теперь нужно сделать так, чтобы Merge(left, right) выполнялась после получения возвращаемых значений от обоих рекурсивных вызовов, то есть и left и right должны обновляться до того, как Merge(left, right) сможет быть выполнена. Для этого на строке 26 мы вводим канал типа bool и отправляем в него true сразу после выполнения left = MergeSort(data[:mid] (строка 32).

Операция <-done блокирует код на строке 35 до инструкции Merge(left,right), чтобы она не продолжилась, пока горутина не завершится. После завершения горутины и получения true в канале done код переходит к инструкции Merge(left, right) на строке 36.

@golang_interview
Как легче всего проверить срез на пустоту?

Создайте программу, проверяющую срез на пустоту. Найдите самое простое решение.

Решение

Легче всего проверить срез на пустоту с помощью встроенной функции len(), которая возвращает длину среза. Если len(slice) == 0, значит срез пуст.

@golang_interview
Каков порядок возврата при использовании несколько функций с defer в рамках одной внешней функции?

Ответ

defer добавляет переданную после него функцию в стэк. При возврате внешней функции, вызываются все, добавленные в стэк вызовы. Поскольку стэк работает по принципу LIFO (last in first out), значения стэка возвращаются в порядке от последнего к первому.

Таким образом функции c deferбудут вызываться в обратной последовательности от их объявления во внешней функции. На этот вопрос любят давать практические задачи.

@golang_interview
Что выведет код?

numbers := []*int{}

for _, value := range []int{1, 2, 3, 4, 5} {
numbers = append(numbers, &value)
}

for _, value := range numbers {
fmt.Println(*value)
}

Запустить и посмотреть объяснение

@golang_interview
Как определить тип интерфейса?

Ответ
С помощью инструкции type switch можно определить тип интерфейса, указав возможные варианты базового типа его значения.

Код

@golang_interview
"Какой размер массива выделяется под слайс при его расширении за рамки его емкости?"

Если отвечать на вопрос поверхностно, то можно сказать, что базовый массив расширяется в два раза от нашей capacity.

Отвечая более емко, следует учесть, что при больших значениях расширение будет не в два раза и будет вычисляться по специальной формуле.

Если развернуть ответ полностью, то это будет звучать примерно так:

если требуемая cap больше чем вдвое исходной cap, то новая cap будет равна требуемой;

если это условие не выполнено, а также len текущего слайса меньше 1024, то новая cap будет в два раза больше базовой cap;

если первое и второе условия не выполнены, то емкость будет увеличиваться в цикле на четверть от базовой емкости пока не будет обработано переполнение. Посмотреть эти условия более подробно можно в исходниках go.

@golang_interview
Использование sync/atomic в golang для float64

У нас есть канал из которого мы можем читать результаты выполнения задач. Результат задачи содержит флаг показывающий была ли ошибка при выполнении задачи и результат выполнения этой задачи (тип float64). Нужно найти сумму всех результатов и количество ошибок.

Реализация с использованием sync.Mutex
Задачу можно решить с использованием sync.Mutex

Ответ

@golang_interview
Расскажите о наиболее общих командах Docker

Ответ:
docker push: Закачать репозиторий или образ в Registry;
docker run: Запустить команду в новом контейнере;
docker pull: Скачать репозиторий или образ из Registry;
docker start: Запустить один или несколько контейнеров;
docker stop: Остановить один или несколько контейнеров;
docker search: Поиск образа на DockerHub;
docker commit: Сохранить изменения в новый образ.

Docker exec - выполнить команду в контейнере
Docker ps (-a) - показать запущенные (все контейнеры)
Docker rm - удалить контейнер
Docker images - посмотреть имеющиеся локальные образы

@golang_interview
Разбор задачи для senior разработчика (Golang)

Разбор популярных задач на собеседованиях для Golang разработчиков (например, слить N каналов в один, сделать конвейер чисел и другие) и их решения.

Разбор задач

@golang_interview
Какой тип приложений больше подходит для контейнеров Docker: с хранением состояния (stateful) или без хранения (stateless)?

Ответ

Приложения без хранения состояния (stateless) больше подходят для работы в Docker, чем приложения с хранением (stateful). Мы можем создать контейнер для нашего приложения и принять некоторые его настройки. Таким образом мы можем запускать один и тот же контейнер с разными настройками для различных окружений. Если мы не будем хранить состояние, сможем использовать один и тот же образ в разных сценариях. Также такие приложения проще масштабировать при их работе в контейнерах Docker.

@golang_interview
Что ты использовал из пакета sync(кроме Mutex и WaitGroup)?

Про примитивы
Go Sync

@golang_interview
Какие сети доступны по умолчанию в Docker?

Ответ

По умолчанию есть:
bridge, сеть, к которой подключаются контейнеры, если не указано иначе.
none, сетевой стек без наличия сетевого интерфейса в контейнере.
host, подключение к сетевому стеку сервера.

@golang_interview
Приведите необходимые шаги для развертывания докеризированного приложения, сохраненного в репозитории Git

Ответ
Шаги, необходимые для развертывания приложения зависят от окружения, основной процесс развертывания будет таким:

- Сборка приложения с использованием Docker build в каталоге с кодом приложения
- Тестирование образа
- Выгрузка образа в Registry
- Уведомление удаленного сервера приложений, что он может скачать образ из Registry и запустить его
- Перестановка порта в прокси HTTP (S)
- Остановка старого контейнера

@golang_interview
Вопросы про кеширование и БД

Какими проблемами в кешировании данных сталкивался?
Как бы ты решал проблему, когда одновременно много клиентов не получают данные из кеша, и все одновременно идут в источник мастер данных(например, в БД)?
Какие плюсы и минусы ты видишь у реляционных СУБД в сравнении с NoSQL решениями? В каком случае ты предпочтешь выбрать NoSQL? С какими NoSQL решениями работал? И с какими трудностями сталкивался при работе с этими решениями?

Ответ

@golang_interview