Golang вопросы собеседований
13.5K subscribers
625 photos
3 videos
1 file
432 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
加入频道
Расскажите о наиболее общих командах 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
Какие типы не являются встраиваемыми?
Какие типы не являются встраиваемыми?
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
Нужно ли лочить структуру мьютексом, если идет конкуррентная запись в разные поля структуры?

Подробнее
Ответ

@golang_interview
Отформатируйте строку без ее вывода

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

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

Например:

package main

import "fmt"

func main() {
s := fmt.Sprintf("Size: %d MB.", 85)
fmt.Println(s)
}

#задача #junior

@golang_interview
Расскажите про структуры данных: stack, queue, linked list, trie, balanced tree, Hash Table

Ответ:
8 известных структур данных, о которых спросят на собеседовании

#теория #middle

@golang_interview
Как работать с sync.pool и sync.map? Какие подводные камни у них есть?

sync.map
sync.Pool
Как не надо использовать sync pool в go

@golang_interview
Что вы знаете про работу с плагинами на Go ?

Ответ
Думаю, что всем, кто пытался добавить поддержку системы плагинов для своего приложения на Go, первым в поиске попадался стандартный пакет plugin. К сожалению, он применим только в двух случаях:

Вы не всегда хотите включать все модули приложения в поставку

Вы хотите динамически подгружать нужные модули по мере необходимости

Собственно, все. Описывать работу с пакетом не вижу смысла - официальная документация снабдит отличными примерами и даст исчерпывающие ответы на все возможные вопросы. Как по мне, путаницу вносит само название пакета, ведь плагин, в привычном понимании, при помощи него создать невозможно. На нас действует серьезное ограничение: плагин должен быть собран тем же окружением, что и основное приложение. Имеются различия в версии компилятора - до свидания, версия плагина отличается от ожидаемой версии приложения - счастливого пути. Фактически, плагин может собрать только сам разработчик основного приложения, что убивает на корню все затею. Также очевидно, что плагин не может быть написан на другом языке. Тем не менее, есть и плюсы: пакет стандартный, поддерживается рантаймом самого языка.

Читать дальше

@golang_interview
Что такое race condition?

Состояние гонки (англ. race condition), также конкуренция — ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода. Своё название ошибка получила от похожей ошибки проектирования электронных схем (см. Гонки сигналов).

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

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

Подробнее

@golang_interview
Какие проблемы решает Service Discovery?

Service Discovery создан для того, чтобы с минимальными затратами можно подключить новое приложение в уже существующее наше окружение. Используя Service Discovery, мы можем максимально разделить либо контейнер в виде докера, либо виртуальный сервис от того окружения, в котором он запущен.


Как это выглядит? На классическом примере в вебе – это фронтенд, который принимает запрос пользователя. Дальше выполняет маршрутизацию его на backend. На данном примере – это load-balancer балансирует на два backend.

На картиннке мы видим, что мы запускаем третий экземпляр приложения. Соответственно, когда приложение запускается, оно производит регистрацию в Service Discovery. Service Discovery уведомляет load-balancer. Load-balancer меняет свой конфиг автоматически и уже новый backend подключается в работу. Таким образом могут добавляться backend, либо, наоборот, исключаться из работы.

@golang_interview
Что такое lvalues и rvalues в Go ?

Ответ:
В Go есть два типа выражений:

lvalue − выражение, которое ссылается на какой-то явный участок памяти называется “lvalue” (“Locator value“), при этом выражение может находится с любой стороны от оператора присваивания.

rvalue − термин r-value (“Raw value“?) применяется к данным, которые хранятся в каком-то участке памяти.
Переменные являются l-values, и могут указываться с левой стороны (тем не менее – не “left-value“, а “locator value“). Числовые литералы, в свою очередь, являются r-values, и не могут быть присвоены к чему-либо, и не должны быть указаны с левой стороны от оператора присваивания.

Т.е. следующее выражение будет корректным:

x = 20.0

Тогда как следующее вызовет ошибку компилятора:


10 = 20

#junior

@golang_interview
Как выполняется мониторинг Docker в производственных окружениях?

Для мониторинга есть инструменты Docker stats и Docker events. С их помощью можно получить отчеты по важной статистике. Если запустить stats с некоторым идентификатором контейнера, он вернет использование оперативной памяти и процессорного времени в контейнере. Это схоже с использованием команды top. С другой стороны есть events, показывающая список активностей в процессе работы сервиса Docker. Вот некоторые из них: подключение к консоли контейнера, commit, переименование, удаление и т.п., а также есть возможность фильтрации нужных событий.

Шпаргалка с командами Docker

#middle

@golang_interview