# Go собеседования

<span>В </span>[этом коротком ролике](http://vkvideo.ru/video-139172865_456239381)<span> перечислены все темы, которые так или иначе всплывают на собеседеваниях по go</span>

# Открытое собеседование на Middle Go-разработчика в WB

<iframe allow="autoplay; encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;" allowfullscreen="" height="360" id="bkmrk-" src="https://vkvideo.ru/video_ext.php?oid=-228753927&id=456239108&hash=53abc2784ccdad71&hd=1" width="640"></iframe>

Из интересного

1. Go-интерфейсы и nil. Тонкости ?
2. L из SOLID в Go. Какие особенности ?
3. Пустой интерфейс. Для чего нужен, как используется ? Почему не можем заменить везде на "any"? Может ли функция быть интерфейсом?
4. Асинхронность vs параллельность
5. Можно ли на Go реализовать чистую параллельность (например на 4 ядра)
6. GOMAXPROC=1 что будет? 1 очередь, 1 процессор, 1 горутина выполняется в моменте
7. GMP
8. GRPC. Концепция, преимущества? В чем плюсы относительно REST-а?
9. Преимущества HTTP2 перед HTTP
10. Схема работы HTTPS/TLS
11. Симметричное и асимметричное шифрование
12. Паттерны Transaction outbox и Transaction inbox
13. Идемпотентность консьюмеров
14. Circuit breaker и Rate Limit
15. Балансировщики трафика L4 L7

# Mock-собеседование со студентом курса Golang

<iframe allow="autoplay; encrypted-media; fullscreen; picture-in-picture; screen-wake-lock;" allowfullscreen="" height="480" id="bkmrk-" src="https://vkvideo.ru/video_ext.php?oid=-145052891&id=456245058&hash=8c25d28260f21075&hd=2" width="853"></iframe>

**Из интересного/в заметки/запомнить/повторить:**

1. <span style="white-space: pre-wrap;">Как устроены строки в Go. Как аппендить/менять строку ? </span>
    1. strings.Builder
    2. Как работает метод Grow ?
    3. Copy On Write
2. Как устроены мапы ?
3. <span style="white-space: pre-wrap;">В чем отличие слайса от массива ? </span>
    1. **Можно ли массиву из 5 элементов присвоить массив из 6 ?**<span style="white-space: pre-wrap;"> Нет, это разные типы данных</span>
    2. **Где аллоцируется слайс ?** Или в стеке или в куче. Когда аппендим слайс - на куче.
    3. **Почему append возвращает слайс?**<span style="white-space: pre-wrap;"> Переприсвоить нужно если была новая аллокация.</span>
    4. <span style="white-space: pre-wrap;">Динамический массив. </span>**Какая сложность удаления из начала?**<span style="white-space: pre-wrap;"> Асимптотическая сложность - линейная.</span>
    5. **Как за константное время удалить первый элемент массива при этом порядок элементов не важен ?** <span style="white-space: pre-wrap;">Свопнуть первый с последним и удалить последний. </span>
4. <span style="white-space: pre-wrap;">Как хранить деньги в Go ? </span>
    1. Структура: рубли и копейки отдельно
    2. Целочисленно: хранить в копейках
    3. Побайтово: 2 байта рубли, 2 байта копейки
    4. Float не берем так как могут быть аномалии при вычислениях из-за потери точности
5. Runtime Go и горутины
    1. GO\_MAX\_PROCS - на что влияет ? Горутина в бесконечном цикле и main. Что будет? Прервется.
    2. Процессы, потоки, горутины - в чем разница?
    3. Когда горутина вызывает сискол - горутина откладывается в специальный поток, на отдельный процессор.
    4. У горутины маленький стек (2Кб), потоки шарят кучу
    5. Каналы. Как устроены внутри. Разделяемая память, мьютексы - в основе каналов. 4 горутины читают, приходит писатель - дождется пока все прочитают и возьмет лок на запись
6. Разница между new и make ?
7. Утиная типизация в Go. Если, что-то крякает как утка - то это утка. Внутри интерфейса есть указатель на мета-информацию. С ней сравнивается реализация.