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

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

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

Вопросы с собеседований по Go и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/0b524a15 Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197

نمایش بیشتر
7 445
مشترکین
-724 ساعت
+197 روز
+5230 روز
آرشیو پست ها
Как посмотреть покрытие кода тестами в Go   Запускаете тесты с флагом -cover для общей цифры. Для детального отчёта генерируете профиль и открываете его в браузере:
go test -coverprofile=coverage.out
go tool cover -html=coverage.out
🐸 Библиотека Go для собеса

Что делает t.Helper() и когда его вызывать t.Helper() помечает функцию как вспомогательную. При падении теста стек ошибки укажет не на строку внутри хелпера, а на строку вызова в тесте. Когда вы выносите повторяющиеся проверки в отдельную функцию, Go по умолчанию при падении теста покажет в стеке строку внутри этой функции. Допустим, у вас есть хелпер assertEqual, который вызывается в двадцати тестах. Тест упал, вы смотрите в лог и видите helper.go:14. Это строка с t.Errorf внутри хелпера. Чтобы понять, какой именно тест сломался, придётся идти по стеку вызовов вручную. Вызов в начале функции говорит Go, что эта функция вспомогательная, и при ошибке нужно показывать не её, а место вызова. Вместо helper.go:14 вы увидите user_test.go:42, то есть конкретную строку теста, где всё пошло не так:
// Без t.Helper() ошибка укажет на строку 3 этой функции
// С t.Helper() ошибка укажет на строку вызова assertEqual в тесте
func assertEqual(t *testing.T, got, want int) {
    t.Helper()
    if got != want {
        t.Errorf("got %d, want %d", got, want)
    }
}
  Вызывать t.Helper() нужно в каждой функции, которая сама не является тестом, но содержит вызовы t.Errorf, t.Fatalf или других методов, фиксирующих ошибку. Если хелпер вызывает другой хелпер, пометить нужно оба. Пропуск t.Helper() не сломает тесты, они будут работать корректно. Но при отладке падений в большом проекте с десятками хелперов отсутствие этой пометки превращает чтение логов в квест. Привычка ставить t.Helper() первой строкой в любой вспомогательной функции экономит время и нервы. 🐸 Библиотека Go для собеса

В какой момент лучше сбрасывать состояние объекта в sync.Pool, при Get или при Put Оба варианта рабочие, но важно выбрать один и придерживаться его. Сброс при Get надёжнее, потому что гарантирует чистое состояние независимо от того, кто и как вернул объект в пул. Сброс при Put экономит время на стороне потребителя, но требует дисциплины от всех, кто кладёт объекты обратно. 🐸 Библиотека Go для собеса

Вы случайно закоммитили в репозиторий файл с секретами. Как это исправить Простого удаления файла и нового коммита недостаточно, потому что секрет останется в истории. Нужно переписать историю через git filter-branch или git filter-repo, удалив файл из всех коммитов. После этого обязательно отозвать скомпрометированные ключи, потому что они могли быть уже скачаны. 🐸 Библиотека Go для собеса

Гарантирует ли sync.Pool, что объект останется в пуле между вызовами GC Нет. Сборщик мусора может в любой момент очистить содержимое пула. sync.Pool не даёт гарантий на время жизни объектов. Поэтому его нельзя использовать как кэш или хранилище. 🐸 Библиотека Go для собеса

Когда использовать функции вместо интерфейсов Ключевой критерий это количество методов в поведении. Если нужно абстрагироваться над одним действием, берите функцию-тип. Если поведение требует нескольких связанных методов — интерфейс. Интерфейс оправдан, когда поведение требует нескольких связанных методов или когда реализация несёт внутреннее состояние — соединение, кэш, буфер. Тогда контракт нужно зафиксировать явно, и интерфейс делает это лучше. Показательный пример из стандартной библиотеки — net/http. Там оба подхода живут рядом: • http.Handler — интерфейс с одним методом ServeHTTPhttp.HandlerFunc — функциональный тип, который реализует этот же интерфейс. Это позволяет передавать как структуры со состоянием, так и простые функции, не заставляя автора каждый раз писать обёртку. 🐸 Библиотека Go для собеса

Можно ли складывать два разных алиаса на один и тот же тип Алиас в Go это другое имя для существующего типа. Когда пишут type Meters = float64, компилятор не создаёт новый тип: Meters и float64 взаимозаменяемы без явного приведения. Компилятор видит оба алиаса как float64 и не различает их. Поэтому сложение, сравнение и передача в функцию работают без приведения типов. Если функция принимает Seconds, в неё без ошибки пройдёт переменная типа Meters. 🐸 Библиотека Go для собеса

👣 Хотите вкатиться в разработку с нуля? Рассмотрите Golang, изучите одну из важных тем языка 📚 На открытом уроке разберём,
👣 Хотите вкатиться в разработку с нуля? Рассмотрите Golang, изучите одну из важных тем языка 📚 На открытом уроке разберём, как устроена типизация в Go, как работают указатели и где хранятся данные — стек, куча или статическая память. Покажем на примерах, как язык управляет памятью и почему это влияет на производительность. Урок проходит в преддверии старта курса «Go-разработчик. Базовый уровень». Если вы хотите разобраться в базовых механизмах языка и писать код без скрытых ошибок — подключайтесь 🤓Встречаемся 21 мая в 20:00 МСК. Регистрация открыта: https://clc.to/0zzq6Q Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Что такое httputil.NewSingleHostReverseProxy и зачем он нужен NewSingleHostReverseProxy создаёт обратный прокси, который перенаправляет входящие HTTP-запросы на один заданный сервер. Вы передаёте функции целевой URL, а она возвращает http.Handler, готовый к использованию. Типичный сценарий это API-шлюз или балансировщик нагрузки перед сервисом. Вместо того чтобы писать логику проксирования вручную, можно получить готовый обработчик в несколько строк:
target, _ := url.Parse("http://backend-service:8080")
proxy := httputil.NewSingleHostReverseProxy(target)
http.ListenAndServe(":80", proxy)
🐸 Библиотека Go для собеса

Решаешь задачи, смотришь курсы, а работы всё нет? 🤨 Потому что знать Go и уметь пройти собес - это разные вещи. Компании не
Решаешь задачи, смотришь курсы, а работы всё нет? 🤨 Потому что знать Go и уметь пройти собес - это разные вещи. Компании не платят за знания. Они платят за тех, кто умеет себя продать и решать задачи в стрессовых условиях. ❤️Меня зовут Дима Урин, и я веду разработчиков до оффера на 300-400к в топ-компании. Лично от первой задачи до закрытия испытательного срока. Хочешь так же?💰 Приходи на ведение Приходи на ведение Реклама. Урин Дмитрий Алексеевич, ИНН 760404084194. Erid 2Vtzqvb278C

Что возвращает Buffer.Peek(n), если в буфере меньше n байт Buffer.Peek возвращает срез доступных байт даже если их меньше n. Ошибки при этом нет. Поведение аналогично bufio.Reader.Peek, но там при нехватке байт возвращается io.ErrUnexpectedEOF — это распространённое заблуждение при переносе привычек из bufio. 🐸 Библиотека Go для собеса

Можно ли отдавать «HTTP 200 OK», если на сервере что-то пошло не так Код 200 говорит клиенту: «Всё прошло штатно, держи результат». Если вместо результата внутри тела прячется ошибка, то клиент вынужден парсить ответ, чтобы понять, что запрос на самом деле провалился. Это ломает саму идею HTTP-контракта. Когда это всё-таки допустимо? При ошибках бизнес-логики. Например, валидация формы вернула список замечаний: сам запрос обработан корректно, просто данные не прошли проверку на уровне домена. Но даже тут стоит трижды подумать. Для всего остального в HTTP уже есть подходящие коды — и они существуют не просто так: 🔹 400 Bad Request — клиент прислал невалидные данные 🔹 404 Not Found — ресурс не существует 🔹 500 Internal Server Error — сервер сломался и не смог обработать запрос 🔹 503 Service Unavailable — сервер на паузе: перегрузка, деплой, обслуживание 🐸 Библиотека Go для собеса

Как сэкономить память при использовании подстроки от строки В Go строки неизменяемы и внутри представлены заголовком с указателем на массив байтов и длиной. При создании среза строки, например, s[10:20] данные не копируются — новый заголовок просто указывает на ту же область памяти оригинала. Из-за этого, если маленькая подстрока живёт дольше родительской строки, весь исходный массив остаётся в памяти, так как сборщик мусора не может его освободить, даже если нужна только небольшая часть. Чтобы экономить память, используйте strings.Clone(substr)или string([]byte(substr)) для создания независимой копии подстроки. Это создаёт новый массив только с нужными байтами, позволяя сборщику мусора освободить большой исходный массив. Копируйте строки только если подстрока действительно живёт значительно дольше родителя — для кратковременной обработки, например, внутри обработчика запроса, срез без копирования эффективнее, так как выделение и копирование дороже, чем удержание лишней памяти. 🐸 Библиотека Go для собеса

Когда использование OnceValue может быть неправильным решением Когда результат зависит от контекста или должен меняться со временем, например, обновляемый конфиг. OnceValue кэширует навсегда и для изменяемых данных нужен другой механизм: atomic, mutex, канал. 🐸 Библиотека Go для собеса

Вы работаете с монолитом, который растёт и замедляет команду, но переход к микросервисам кажется рискованным? В большинстве с
Вы работаете с монолитом, который растёт и замедляет команду, но переход к микросервисам кажется рискованным? В большинстве случаев проблема не в архитектуре, а в неверных решениях на этапе разделения. 📆 Приглашаем вас на открытое онлайн-занятие «Грамотная декомпозиция монолита (когда микросервисы не нужны)», которое проходит в преддверии старта курса «Микросервисы на Go». Вы увидите, как проходит обучение, и разберёте реальные подходы вместе с преподавателем. На занятии вы узнаете, как определить готовность проекта к разделению, какие признаки указывают на необходимость изменений и как избежать появления распределённого монолита. Разберёте работу с событиями, ошибки с общими библиотеками и подходы к выделению первого сервиса без риска для системы. Можно задать вопросы и обсудить свою ситуацию. 🚀 Занятие пройдёт 19 мая в 20:00 по московскому времени. Участие бесплатное. Зарегистрируйтесь заранее, чтобы не пропустить: https://clc.to/ulHozw Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Что изменилось в команде go fix в Go 1.26 go fix была полностью переписана с нуля. Вот ключевые изменения: Старая реализация cmd/fix была удалена, а go fix перестроена по модели go vet — обе команды теперь работают поверх одного и того же фреймворка. Разница между ними в том, что go vet сообщает о диагностике, а go fix применяет предложенные исправления. Команда Go разработала десятки анализаторов для выявления возможностей модернизации кода. Они предоставляют надёжный способ обновить кодовую базу до актуальных идиом и API стандартной библиотеки. Все старые фиксеры из оригинальной go fix, которые к этому моменту были устаревшими, были полностью удалены. 🐸 Библиотека Go для собеса

Как использовать context в юнит-тестах t.Context() — основной способ (Go 1.24+):
func TestFetch(t *testing.T) {
    result, err := Fetch(t.Context(), "https://example.com")
    // ...
}
Контекст автоматически отменяется при завершении теста, в том числе по go test -timeout. Не нужен ни defer cancel(), ни ручной WithTimeout. Явный таймаут — когда тестируете временно́е поведение:
ctx, cancel := context.WithTimeout(t.Context(), 500*time.Millisecond)
defer cancel()
Базовый контекст — t.Context(), не context.Background(). Так контекст остаётся привязан к жизненному циклу теста. 🐸 Библиотека Go для собеса

🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев Эмиль — эксперт с 8-летним опытом в разработке, который специализиру
🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами. 🏃‍♀️ Уже 14 мая Эмиль проведет открытый вебинар! Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало». 🗓 Когда: 14 мая в 19:00 (Мск) Почему Эмиля стоит послушать: 🟣 8+ лет в разработке (Backend и Frontend)
Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.
🟣 Международный исследовательский опыт
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).
🟣 Преподаватель-практик
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.
🟣 Мастер интеграции AI в Backend
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.
🔗 Зарегистрироваться на вебинар

Что изменилось в функции new в go 1.26 Теперь в качестве аргумента можно передавать не только тип, но и выражение с начальным значением.
p := new(42) // *p == 42
Если аргумент expr имеет тип T, то new(expr) выделяет переменную типа T, инициализирует её значением expr и возвращает указатель типа *T. 🐸 Библиотека Go для собеса

👣 Пишете сервисы на Go, но при работе с базой данных всё становится сложнее? На практике именно здесь возникают проблемы: ка
👣 Пишете сервисы на Go, но при работе с базой данных всё становится сложнее? На практике именно здесь возникают проблемы: как правильно строить схему, как управлять изменениями, что выбрать — ORM или чистый SQL. 📖 На открытом уроке разберём, как работать с базой данных в Go: создание таблиц, миграции и выполнение запросов. Покажем, как выстроить понятную структуру и избежать типичных ошибок на старте. Урок проходит в преддверии старта курса «Go-разработчик. Базовый уровень». Если вы хотите уверенно работать с базами данных в своих сервисах — подключайтесь. ❗️ Урок проведёт руководитель курса «Go-разработчик. Базовый уровень» Александр Хохлов. На вебинаре сможете задать любые вопросы по программе, чтобы убедиться, что курс вам подходит. 🔵 Встречаемся 14 мая в 20:00 МСК. Принять участие: https://clc.to/eIj-aA Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru