Библиотека Go для собеса | вопросы с собеседований
7.43K subscribers
258 photos
10 videos
1 file
766 links
Вопросы с собеседований по Go и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/0b524a15

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Как обработать сразу несколько ошибок

До версии 1.20 ошибки обрабатывались поочерёдно. Начиная с 1.20 появилась возможность объединить несколько ошибок в одну агрегированную с помощью errors.Join.

err = errors.Join(function1(), function2())

if err != nil {
fmt.Println(err)
// выведет все ошибки через \n



errors.Join возвращает nil, если все переданные ошибки равны nil. Иначе он возвращает составную ошибку, которую можно раскрыть через errors.Unwrap.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
Как разбить массив, если могут быть несколько разделителей подряд

FieldsFunc пропускает любое количество подряд идущих разделителей и не создаёт пустых элементов между ними — в отличие от Split, который создаёт пустую строку на каждый лишний разделитель:
data := []byte("foo,,bar,,,baz")

parts := bytes.FieldsFunc(data, func(r rune) bool {
return r == ','
})

// ["foo" "bar" "baz"]

bytes.Split([]byte("foo,,bar"), []byte(","))
// ["foo" "" "bar"] — пустой элемент между двумя запятыми


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
Что делает slices.Compact

slices.Compact удаляет подряд идущие дубликаты, то есть оставляет только первый элемент из каждой группы одинаковых соседних значений.

s := []int{1, 1, 2, 3, 3, 3, 4, 1, 1}
s = slices.Compact(s)
// [1 2 3 4 1]


Compact работает in-place и возвращает подсрез того же массива — лишние элементы в хвосте не обнуляются, просто укорачивается длина.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🗓 14 мая в 19:00 (Мск) встречаемся в онлайне.

Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало.

В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать.

Что в программе:
- Разберем реальные кейсы стартапов и ограничения LLM.
- Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества.
- Ответим на ваши вопросы и разберем кейсы участников.


🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы.

👉 Зарегистрироваться на вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вам вопросы этой недели

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуется фидбек в комментариях.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥6👍3🥱1👾1
Какое обязательное требование к срезу для slices.BinarySearch
 
Срез должен быть отсортирован по возрастанию — иначе результат непредсказуем.
 
names := []string{"Alice", "Bob", "Vera"}
n, found := slices.BinarySearch(names, "Bill")
// n=1, found=false — позиция, куда нужно вставить "Bill"
 
n, found = slices.BinarySearch(names, "Vera")
// n=2, found=true


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁2
Что изменилось в функции new в go 1.26

Теперь в качестве аргумента можно передавать не только тип, но и выражение с начальным значением.

p := new(42) // *p == 42


Если аргумент expr имеет тип T, то new(expr) выделяет переменную типа T, инициализирует её значением expr и возвращает указатель типа *T.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍1
🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев

Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами.

🏃‍♀️ Уже 14 мая Эмиль проведет открытый вебинар!

Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».

🗓 Когда: 14 мая в 19:00 (Мск)

Почему Эмиля стоит послушать:

🟣 8+ лет в разработке (Backend и Frontend)
Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.


🟣 Международный исследовательский опыт
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).


🟣 Преподаватель-практик
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.


🟣 Мастер интеграции AI в Backend
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.


🔗 Зарегистрироваться на вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Как использовать 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 для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Что изменилось в команде go fix в Go 1.26

go fix была полностью переписана с нуля. Вот ключевые изменения:

Старая реализация cmd/fix была удалена, а go fix перестроена по модели go vet — обе команды теперь работают поверх одного и того же фреймворка. Разница между ними в том, что go vet сообщает о диагностике, а go fix применяет предложенные исправления.

Команда Go разработала десятки анализаторов для выявления возможностей модернизации кода. Они предоставляют надёжный способ обновить кодовую базу до актуальных идиом и API стандартной библиотеки.

Все старые фиксеры из оригинальной go fix, которые к этому моменту были устаревшими, были полностью удалены.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁21
Вы работаете с монолитом, который растёт и замедляет команду, но переход к микросервисам кажется рискованным? В большинстве случаев проблема не в архитектуре, а в неверных решениях на этапе разделения.

📆 Приглашаем вас на открытое онлайн-занятие «Грамотная декомпозиция монолита (когда микросервисы не нужны)», которое проходит в преддверии старта курса «Микросервисы на Go». Вы увидите, как проходит обучение, и разберёте реальные подходы вместе с преподавателем.

На занятии вы узнаете, как определить готовность проекта к разделению, какие признаки указывают на необходимость изменений и как избежать появления распределённого монолита. Разберёте работу с событиями, ошибки с общими библиотеками и подходы к выделению первого сервиса без риска для системы. Можно задать вопросы и обсудить свою ситуацию.

🚀 Занятие пройдёт 19 мая в 20:00 по московскому времени. Участие бесплатное.

Зарегистрируйтесь заранее, чтобы не пропустить: https://clc.to/ulHozw

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда использование OnceValue может быть неправильным решением

Когда результат зависит от контекста или должен меняться со временем, например, обновляемый конфиг.

OnceValue кэширует навсегда и для изменяемых данных нужен другой механизм: atomic, mutex, канал.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как сэкономить память при использовании подстроки от строки

В Go строки неизменяемы и внутри представлены заголовком с указателем на массив байтов и длиной. При создании среза строки, например, s[10:20] данные не копируются — новый заголовок просто указывает на ту же область памяти оригинала. Из-за этого, если маленькая подстрока живёт дольше родительской строки, весь исходный массив остаётся в памяти, так как сборщик мусора не может его освободить, даже если нужна только небольшая часть.

Чтобы экономить память, используйте strings.Clone(substr)или string([]byte(substr)) для создания независимой копии подстроки. Это создаёт новый массив только с нужными байтами, позволяя сборщику мусора освободить большой исходный массив.

Копируйте строки только если подстрока действительно живёт значительно дольше родителя — для кратковременной обработки, например, внутри обработчика запроса, срез без копирования эффективнее, так как выделение и копирование дороже, чем удержание лишней памяти.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Можно ли отдавать «HTTP 200 OK», если на сервере что-то пошло не так

Код 200 говорит клиенту: «Всё прошло штатно, держи результат». Если вместо результата внутри тела прячется ошибка, то клиент вынужден парсить ответ, чтобы понять, что запрос на самом деле провалился. Это ломает саму идею HTTP-контракта.

Когда это всё-таки допустимо? При ошибках бизнес-логики. Например, валидация формы вернула список замечаний: сам запрос обработан корректно, просто данные не прошли проверку на уровне домена. Но даже тут стоит трижды подумать.

Для всего остального в HTTP уже есть подходящие коды — и они существуют не просто так:

🔹 400 Bad Request — клиент прислал невалидные данные
🔹 404 Not Found — ресурс не существует
🔹 500 Internal Server Error — сервер сломался и не смог обработать запрос
🔹 503 Service Unavailable — сервер на паузе: перегрузка, деплой, обслуживание

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
5