Отформатируйте строку без ее вывода
Найдите самый простой способ отформатировать строку с переменными, не выводя значение.
Ответ
Легче всего это сделать с помощью fmt.Sprintf(), которая возвращает строку, не выводя ее на экран.
@golang_interview
Найдите самый простой способ отформатировать строку с переменными, не выводя значение.
Ответ
Легче всего это сделать с помощью 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
Реализуйте конкурентное решение 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
Создайте программу, проверяющую срез на пустоту. Найдите самое простое решение.
Решение
Легче всего проверить срез на пустоту с помощью встроенной функции len(), которая возвращает длину среза. Если len(slice) == 0, значит срез пуст.
@golang_interview
Каков порядок возврата при использовании несколько функций с defer в рамках одной внешней функции?
Ответ
defer добавляет переданную после него функцию в стэк. При возврате внешней функции, вызываются все, добавленные в стэк вызовы. Поскольку стэк работает по принципу LIFO (last in first out), значения стэка возвращаются в порядке от последнего к первому.
Таким образом функции c deferбудут вызываться в обратной последовательности от их объявления во внешней функции. На этот вопрос любят давать практические задачи.
@golang_interview
Ответ
defer добавляет переданную после него функцию в стэк. При возврате внешней функции, вызываются все, добавленные в стэк вызовы. Поскольку стэк работает по принципу LIFO (last in first out), значения стэка возвращаются в порядке от последнего к первому.
Таким образом функции c deferбудут вызываться в обратной последовательности от их объявления во внешней функции. На этот вопрос любят давать практические задачи.
@golang_interview
Что выведет код?
@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
Ответ
С помощью инструкции type switch можно определить тип интерфейса, указав возможные варианты базового типа его значения.
Код
@golang_interview
"Какой размер массива выделяется под слайс при его расширении за рамки его емкости?"
Если отвечать на вопрос поверхностно, то можно сказать, что базовый массив расширяется в два раза от нашей capacity.
Отвечая более емко, следует учесть, что при больших значениях расширение будет не в два раза и будет вычисляться по специальной формуле.
Если развернуть ответ полностью, то это будет звучать примерно так:
если требуемая cap больше чем вдвое исходной cap, то новая cap будет равна требуемой;
если это условие не выполнено, а также len текущего слайса меньше 1024, то новая cap будет в два раза больше базовой cap;
если первое и второе условия не выполнены, то емкость будет увеличиваться в цикле на четверть от базовой емкости пока не будет обработано переполнение. Посмотреть эти условия более подробно можно в исходниках go.
@golang_interview
Если отвечать на вопрос поверхностно, то можно сказать, что базовый массив расширяется в два раза от нашей capacity.
Отвечая более емко, следует учесть, что при больших значениях расширение будет не в два раза и будет вычисляться по специальной формуле.
Если развернуть ответ полностью, то это будет звучать примерно так:
если требуемая cap больше чем вдвое исходной cap, то новая cap будет равна требуемой;
если это условие не выполнено, а также len текущего слайса меньше 1024, то новая cap будет в два раза больше базовой cap;
если первое и второе условия не выполнены, то емкость будет увеличиваться в цикле на четверть от базовой емкости пока не будет обработано переполнение. Посмотреть эти условия более подробно можно в исходниках go.
@golang_interview
Для чего можно использовать пустую структуру - `struct{}`?
Anonymous Quiz
8%
пустую структуру использовать нельзя
65%
чтобы сэкономить память
26%
чтобы использовать динамическое определение типа
Использование sync/atomic в golang для float64
У нас есть канал из которого мы можем читать результаты выполнения задач. Результат задачи содержит флаг показывающий была ли ошибка при выполнении задачи и результат выполнения этой задачи (тип float64). Нужно найти сумму всех результатов и количество ошибок.
Реализация с использованием sync.Mutex
Задачу можно решить с использованием sync.Mutex
Ответ
@golang_interview
У нас есть канал из которого мы можем читать результаты выполнения задач. Результат задачи содержит флаг показывающий была ли ошибка при выполнении задачи и результат выполнения этой задачи (тип float64). Нужно найти сумму всех результатов и количество ошибок.
Реализация с использованием sync.Mutex
Задачу можно решить с использованием sync.Mutex
Ответ
@golang_interview
Что из следующего справедливо в отношении цикла в Go, если присутствует предложение where (init; condition; increment)?
Anonymous Quiz
11%
Первый шаг выполняется сначала, и только один раз.
15%
init позволяет вам объявлять и инициализировать любые переменные управления циклом.
10%
Вы не обязаны указывать инструкцию в шаге init, пока отображается точка с запятой.
65%
Все вышеперечисленное.
Расскажите о наиболее общих командах 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
Ответ:
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
Разбор популярных задач на собеседованиях для Golang разработчиков (например, слить N каналов в один, сделать конвейер чисел и другие) и их решения.
Разбор задач
@golang_interview
Какой тип приложений больше подходит для контейнеров Docker: с хранением состояния (stateful) или без хранения (stateless)?
Ответ
Приложения без хранения состояния (stateless) больше подходят для работы в Docker, чем приложения с хранением (stateful). Мы можем создать контейнер для нашего приложения и принять некоторые его настройки. Таким образом мы можем запускать один и тот же контейнер с разными настройками для различных окружений. Если мы не будем хранить состояние, сможем использовать один и тот же образ в разных сценариях. Также такие приложения проще масштабировать при их работе в контейнерах Docker.
@golang_interview
Ответ
Приложения без хранения состояния (stateless) больше подходят для работы в Docker, чем приложения с хранением (stateful). Мы можем создать контейнер для нашего приложения и принять некоторые его настройки. Таким образом мы можем запускать один и тот же контейнер с разными настройками для различных окружений. Если мы не будем хранить состояние, сможем использовать один и тот же образ в разных сценариях. Также такие приложения проще масштабировать при их работе в контейнерах Docker.
@golang_interview
Какие сети доступны по умолчанию в Docker?
Ответ
По умолчанию есть:
bridge, сеть, к которой подключаются контейнеры, если не указано иначе.
none, сетевой стек без наличия сетевого интерфейса в контейнере.
host, подключение к сетевому стеку сервера.
@golang_interview
Ответ
По умолчанию есть:
bridge, сеть, к которой подключаются контейнеры, если не указано иначе.
none, сетевой стек без наличия сетевого интерфейса в контейнере.
host, подключение к сетевому стеку сервера.
@golang_interview
Приведите необходимые шаги для развертывания докеризированного приложения, сохраненного в репозитории Git
Ответ
Шаги, необходимые для развертывания приложения зависят от окружения, основной процесс развертывания будет таким:
- Сборка приложения с использованием Docker build в каталоге с кодом приложения
- Тестирование образа
- Выгрузка образа в Registry
- Уведомление удаленного сервера приложений, что он может скачать образ из Registry и запустить его
- Перестановка порта в прокси HTTP (S)
- Остановка старого контейнера
@golang_interview
Ответ
Шаги, необходимые для развертывания приложения зависят от окружения, основной процесс развертывания будет таким:
- Сборка приложения с использованием Docker build в каталоге с кодом приложения
- Тестирование образа
- Выгрузка образа в Registry
- Уведомление удаленного сервера приложений, что он может скачать образ из Registry и запустить его
- Перестановка порта в прокси HTTP (S)
- Остановка старого контейнера
@golang_interview
Вопросы про кеширование и БД
Какими проблемами в кешировании данных сталкивался?
Как бы ты решал проблему, когда одновременно много клиентов не получают данные из кеша, и все одновременно идут в источник мастер данных(например, в БД)?
Какие плюсы и минусы ты видишь у реляционных СУБД в сравнении с NoSQL решениями? В каком случае ты предпочтешь выбрать NoSQL? С какими NoSQL решениями работал? И с какими трудностями сталкивался при работе с этими решениями?
Ответ
@golang_interview
Какими проблемами в кешировании данных сталкивался?
Как бы ты решал проблему, когда одновременно много клиентов не получают данные из кеша, и все одновременно идут в источник мастер данных(например, в БД)?
Какие плюсы и минусы ты видишь у реляционных СУБД в сравнении с NoSQL решениями? В каком случае ты предпочтешь выбрать NoSQL? С какими NoSQL решениями работал? И с какими трудностями сталкивался при работе с этими решениями?
Ответ
@golang_interview
Какие типы не являются встраиваемыми?
Anonymous Quiz
10%
A E F K
8%
A B E F K
16%
A B E F H K
32%
ни одного
33%
все
Расскажите о CMD и ENTRYPOINT в Dockerfile
Эти инструкции Dockerfile задают команду, исполняемую при запуске контейнера. При их использовании есть несколько правил, например:
Должна быть минимум одна из них, CMD или ENTRYPOINT, в Dockerfile.
Если контейнер используется как исполняемый файл — ENTRYPOINT должна быть определена.
Если контейнер запускается с другими аргументами — CMD будет переопределена.
Подробнее
@golang_interview
Эти инструкции Dockerfile задают команду, исполняемую при запуске контейнера. При их использовании есть несколько правил, например:
Должна быть минимум одна из них, CMD или ENTRYPOINT, в Dockerfile.
Если контейнер используется как исполняемый файл — ENTRYPOINT должна быть определена.
Если контейнер запускается с другими аргументами — CMD будет переопределена.
Подробнее
@golang_interview
Нужно ли лочить структуру мьютексом, если идет конкуррентная запись в разные поля структуры?
Подробнее
Ответ
@golang_interview
Подробнее
Ответ
@golang_interview