fa
Feedback
Библиотека Go для собеса | вопросы с собеседований

Библиотека Go для собеса | вопросы с собеседований

رفتن به کانال در Telegram

Вопросы с собеседований по Go и ответы на них. Покажем, как запустить своего ии-агента: https://clc.to/tvpmD По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197

نمایش بیشتر
7 429
مشترکین
-324 ساعت
-167 روز
+930 روز
آرشیو پست ها
Что такое sync.WaitGroup sync.WaitGroup — это примитив синхронизации из стандартного пакета sync, предназначенный для ожидания завершения группы горутин. WaitGroup использует внутренний счётчик: • Счётчик увеличивается при добавлении новых задач • Уменьшается при завершении каждой задачи • Когда счётчик достигает нуля — все задачи выполнены Пример использования:
func main() {
    var wg sync.WaitGroup

    numWorkers := 3
    wg.Add(numWorkers) // Устанавливаем счётчик равным количеству горутин

    for i := 1; i <= numWorkers; i++ {
        go worker(i, &wg) // Запускаем горутины
    }

    wg.Wait() // Блокируемся до завершения всех горутин
    fmt.Println("Все горутины завершены")
}
🐸 Библиотека Go для собеса

Что происходит, когда у слайса не хватает ёмкости для добавления элемента Под капотом: 1. Выделяется новый массив с большей ёмкостью 2. Копируются все существующие элементы в новый массив 3. Добавляется новый элемент 4. Возвращается новый слайс, указывающий на новый массив Четвёртый пункт — это одна из причин, почему важно всегда присваивать результат append(). Старый слайс может указывать на старый массив, а новый слайс — на новый. 🐸 Библиотека Go для собеса

Какой тип не может быть константой Константы могут быть только базовых типов: булевые, числовые, строковые или руны. Составные типы вроде срезов, мап и структур не могут быть константами, поскольку они требуют выделения памяти во время выполнения и не вычисляются полностью на этапе компиляции. 🐸 Библиотека Go для собеса

Почему при передаче слайса в функцию изменения элементов видны снаружи функции Слайс — это структура из трех полей: указатель на базовый массив, длина и ёмкость. Когда вы передаете слайс в функцию, копируется эта структура, но указатель внутри неё продолжает ссылаться на тот же базовый массив. Однако если вы делаете append и слайс перевыделится, то внутри функции слайс начинает указывать на новый массив, а снаружи остается ссылка на старый. 🐸 Библиотека Go для собеса

Примитивы синхронизации в Go Конкурентность — одно из ключевых преимуществ Go, но именно здесь начинающие разработчики чаще в
Примитивы синхронизации в Go Конкурентность — одно из ключевых преимуществ Go, но именно здесь начинающие разработчики чаще всего сталкиваются с гонками данных, дедлоками и нестабильным поведением приложений. Без понимания примитивов синхронизации писать надёжный Go-код невозможно. На открытом уроке разберём, зачем в Go нужна синхронизация и как правильно работать с общими ресурсами при использовании горутин. Рассмотрим Mutex и RWMutex, семафоры, WaitGroup, atomic-операции и sync.Once. Поговорим о типичных ошибках, а также о том, как отлаживать и тестировать конкурентный код. Урок будет полезен начинающим Go-разработчикам, которые уже знакомы с горутинами, а также разработчикам на других языках, желающим глубже понять модель многопоточности в Go. → Этот вебинар проходит в формате открытого урока курса «Golang Developer. Basic»: https://clc.to/szIokQ Реклама. ООО «Отус онлайн‑образование», ОГРН 1177746618576

Что такое TUI и чем он отличается от GUI TUI — текстовый пользовательский интерфейс, работающий в терминале. В отличие от GUI использует символы для отрисовки интерфейса, работает в консоли. Примеры TUI: midnight commander, htop, vim. Примеры GUI: VSCode, браузеры, графические редакторы. 🐸 Библиотека Go для собеса

Как вам вопросы прошедшей недели Оцените их по шкале 🔥,❤️,👍,😢, 🥱, где 🔥 — это супер, а 🥱 — это скучно. Также приветствуется фидбек в комментах. 🐸 Библиотека Go для собеса

В чём разница между стеком и хипом Два разных участка памяти с противоположными характеристиками. Stack работает по принципу LIFO (последний зашёл — первый вышел). Быстрый, автоматически управляемый, ограниченный по размеру. Здесь живут локальные переменные и параметры функций. Память освобождается сразу при выходе из области видимости. Heap — динамическая область памяти. Медленнее, требует ручного управления или сборщика мусора, практически неограниченный. Подходит для данных, которые должны жить дольше одной функции или имеют неизвестный размер на момент компиляции. 🐸Библиотека Go для собеса

Можно ли передавать каналы в каналах Да, поскольку каналы являются типами первого класса. Пример:
package main

import (
    "fmt"
    "time"
)

func main() {
    // Канал, который передаёт другие каналы типа int
    chanOfChans := make(chan chan int)
    
    // Горутина, которая создаёт и отправляет канал
    go func() {
        ch := make(chan int)
        chanOfChans <- ch  // Отправляем канал
        ch <- 100          // Отправляем значение в этот канал
        close(ch)
    }()
    
    // Получаем канал
    receivedChan := <-chanOfChans
    
    // Читаем из полученного канала
    value := <-receivedChan
    fmt.Printf("Получено значение: %d\n", value)
}
🐸Библиотека Go для собеса

Что произойдёт, если закрыть канал дважды Закрытие канала — сигнал получателям о том, что данных больше не будет. После закрытия канала отправка в канал вызывает панику, чтение возвращает zero value типа и флаг false при проверке value, ok := <-ch, а повторное закрытие вызывает панику. Полезный паттерн: использовать sync.Once для гарантии однократного закрытия или done-канал для координации завершения. 🐸Библиотека Go для собеса

Пятница, 19:00. Худшее время для деплоя, но идеальное, чтобы понять, как устроены ИИ-агенты под капотом, и блеснуть этими знаниями на собеседовании. Gopher’ам тоже нужно понимать, как работают LLM. Сегодня на открытом уроке обсудим архитектурные паттерны современных ИИ-систем. Ключевые вопросы: — чем RAG отличается от дообучения (`Fine-tuning`) в продакшене; — векторные базы данных: когда и зачем они нужны; — как собрать систему, отвечающую по PDF-файлам. Один из спикеров — Алексей Яндутов, ML-инженер в поиске Яндекса. Занятие проходит в рамках курса «Разработка AI-агентов». Это технический контент. Записаться на урок

В чём отличие Int от UInt Главное отличие — в диапазоне значений, которые можно хранить. Int — это целое число со знаком. Может быть как положительным, так и отрицательным. Один бит уходит на хранение знака, поэтому диапазон делится пополам между положительными и отрицательными значениями. UInt — беззнаковое целое число (U = unsigned). Хранит неотрицательные значения, начиная с нуля. Поскольку знак не нужен, все биты используются для хранения величины числа. Практический пример для 8-битных типов: Int8: от -128 до 127 UInt8: от 0 до 255 Оба занимают одинаковое количество памяти, но UInt может хранить в два раза большее положительное число за счёт отсутствия отрицательной части. 🐸Библиотека Go для собеса

Зачем append возвращает слайс append возвращает слайс, потому что операция добавления элементов может привести к реаллокации базового массива, если текущая capacity недостаточна. Поэтому если бы append не возвращал слайс, а модифицировал исходный, мы бы потеряли ссылку на новый массив после реаллокации. Даже если реаллокация не произошла и базовый массив остался тем же, возвращаемый слайс будет иметь обновленную длину. 🐸Библиотека Go для собеса

ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩‍💻-СОБЕС В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно о
ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩‍💻-СОБЕС В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним. Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему. Регулярно проверяйте свои hard-skills. Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов! P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать! Помни, что каждое собеседование в 2026 на вес золота!

Как можно получить дедлок при работе с горутинами Deadlock возникает, когда все горутины заблокированы и ждут друг-друга, из-за чего программа не может продолжить выполнение. Рантайм обнаруживает это и завершает программу с ошибкой fatal error: all goroutines are asleep - deadlock!. Типичные причины дедлоков: отправка в небуферизованный канал без получателя, чтение из канала без отправителя, циклическое ожидание на мьютексах, ожидание на WaitGroup, которая никогда не завершится. Примеры:
// Пример 1: отправка без получателя
ch := make(chan int)
ch <- 1 // deadlock - никто не читает

// Пример 2: чтение без отправителя
ch := make(chan int)
<-ch // deadlock - никто не пишет

// Пример 3: взаимная блокировка
var mu1, mu2 sync.Mutex
go func() {
    mu1.Lock()
    mu2.Lock() // ждет mu2
}()
mu2.Lock()
mu1.Lock() // ждет mu1
Используйте select с default или таймауты для предотвращения. 🐸Библиотека Go для собеса

Что происходит при склеивании строк Строки в Go неизменяемы. При использовании оператора «+» для конкатенации каждый раз создается новая строка в памяти. Это приводит к избыточным аллокациям и падению производительности при частых операциях склеивания. Для построения строк используйте strings.Builder — он накапливает данные во внутреннем буфере и минимизирует выделение памяти. Пример с strings.Builder:
var builder strings.Builder
for i := 0; i < 1000; i++ {
    builder.WriteString("x")
}
result := builder.String()
🐸Библиотека Go для собеса

Как вам вопросы прошедшей недели Оцените их по шкале 🔥,❤️,👍,😢, 🥱, где 🔥 — это супер, а 🥱 — это скучно. Также приветствуется фидбек в комментах. 🐸 Библиотека Go для собеса

Какие основные сущности в планировщике в Go Планировщик Go реализует модель M:N, где M горутин выполняются на N потоках ОС. В его основе лежат три ключевые сущности: G (Goroutines) — это потоки выполнения, основные единицы конкурентности в Go. Они значительно легче потоков ОС и могут создаваться тысячами. M (Machines) — это потоки операционной системы, которые непосредственно исполняют код на физических ядрах процессора. Они выполняют горутины. P (Processors) — логические процессоры, которые служат связующим звеном между G и M. Каждый P имеет локальную очередь готовых к выполнению горутин и управляет их распределением. Количество P обычно равно числу доступных ядер CPU. Горутины хранятся в очередях выполнения— есть локальные очереди у каждого P и одна глобальная. 🎁 Новогодняя акция: 3 курса по цене 1 🤝 Помощь с выбором курса 🐸Библиотека Go для собеса

«Этот манёвр будет стоить нам 51 год...» На собеседованиях по Go всё чаще спрашивают не только про горутины и каналы, но и пр
«Этот манёвр будет стоить нам 51 год...» На собеседованиях по Go всё чаще спрашивают не только про горутины и каналы, но и про фундаментальные алгоритмы и архитектуру высоконагруженных систем. Не ждите, пока пробелы в знаниях станут критическими. В Proglib Academy поднимаются цены. У вас есть шанс зайти на обучение по старой стоимости: — Разработка ИИ-агентов — Математика для разработки AI-моделей — ML для старта в Data Science — Математика для Data Science — Специалист по ИИ — Алгоритмы и структуры данных — Программирование на Python — Основы IT для непрограммистов — Архитектуры и шаблоны проектирования Забрать базу для собеседований ⚠️ Цены вырастут уже 19 января