"Как преобразовать интерфейс к другому типу?"
Ответ
Интерфейс можно преобразовать в базовый тип значения (скастить). Для этого используется синтаксис, возвращающий две переменные, одна из которых булевая.
В случае, если не удалось скастить интерфейс, булевая переменная будет ложной, а переменная базового типа, к которому приводим интерфейс будет равна дефолтному значению этого типа.
@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
Например, ввод 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
Найдите самый простой способ отформатировать строку с переменными, не выводя значение.
Ответ
Легче всего это сделать с помощью 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