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

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

前往频道在 Telegram

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

显示更多
7 431
订阅者
-224 小时
+67
+3430
吸引订阅者
六月 '26
六月 '26
+22
在0个频道中
五月 '26
+135
在1个频道中
Get PRO
四月 '26
+143
在1个频道中
Get PRO
三月 '26
+153
在0个频道中
Get PRO
二月 '26
+307
在3个频道中
Get PRO
一月 '26
+154
在0个频道中
Get PRO
十二月 '25
+139
在3个频道中
Get PRO
十一月 '25
+125
在2个频道中
Get PRO
十月 '25
+117
在1个频道中
Get PRO
九月 '25
+77
在0个频道中
Get PRO
八月 '25
+150
在2个频道中
Get PRO
七月 '25
+144
在0个频道中
Get PRO
六月 '25
+147
在3个频道中
Get PRO
五月 '25
+148
在0个频道中
Get PRO
四月 '25
+165
在1个频道中
Get PRO
三月 '25
+352
在52个频道中
Get PRO
二月 '25
+214
在31个频道中
Get PRO
一月 '25
+339
在35个频道中
Get PRO
十二月 '24
+361
在35个频道中
Get PRO
十一月 '24
+305
在37个频道中
Get PRO
十月 '24
+287
在35个频道中
Get PRO
九月 '24
+317
在35个频道中
Get PRO
八月 '24
+309
在35个频道中
Get PRO
七月 '24
+355
在36个频道中
Get PRO
六月 '24
+293
在29个频道中
Get PRO
五月 '24
+314
在35个频道中
Get PRO
四月 '24
+355
在35个频道中
Get PRO
三月 '24
+437
在29个频道中
Get PRO
二月 '24
+395
在29个频道中
Get PRO
一月 '24
+545
在24个频道中
Get PRO
十二月 '23
+627
在28个频道中
Get PRO
十一月 '23
+488
在7个频道中
Get PRO
十月 '23
+1 507
在22个频道中
日期
订阅者增长
提及
频道
04 六月+7
03 六月+2
02 六月+6
01 六月+7
频道帖子
Какого размера тип int Он платформозависимый. На современных платформах занимает 64 бита, на старых 32. Спецификация гарантирует только то, что это либо 32, либо 64 бита, поэтому полагаться на конкретный размер нельзя. 🐸 Библиотека Go для собеса

2
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов:
⚡️ Продолжаем знакомить вас с экспертами курса AgentOps! — Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов — Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем — Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена — Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation — Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса. 👉 Изучить обновленную программу AgentOps и занять место.
597
3
❓ Как реализовать разворот среза без дополнительной памяти Классический приём это два указателя, которые идут навстречу друг другу. Один смотрит на начало, второй на конец, мы меняем элементы местами и сдвигаем оба к середине. Как только указатели встретились или пересеклись, срез развёрнут. Дополнительная память тут не нужна, мы переиспользуем уже выделенный массив, а в Go обмен значений делается одной строкой через множественное присваивание, без временной переменной. func reverse[T any](s []T) { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j], s[i] } } 🐸 Библиотека Go для собеса
710
4
❓ Что такое арифметика указателей Арифметика указателей это выполнение математических операций: сложение, вычитание, инкремент, декремент; над указателями, то есть над переменными, которые хранят адреса в памяти. Ключевая идея в том, что когда вы прибавляете к указателю число, он смещается не на это количество байт, а на количество элементов того типа, на который он указывает. Почему это считается опасным и почему в Go от этого отказались: ничто не мешает сдвинуть указатель за пределы массива и обратиться к чужой или несуществующей памяти. Компилятор это не проверяет, а результат — труднонаходимые ошибки, повреждение данных или уязвимости. 🐸 Библиотека Go для собеса
762
5
❓ Как найти максимальный элемент в срезе за O(n) Максимум в срезе находится за один проход. Мы заводим переменную под текущий максимум, кладём в неё первый элемент и дальше идём по остальным, сравнивая каждый с накопленным значением. Если встретили больше, обновляем. Один проход по n элементам даёт сложность O(n), и меньше уже не получится, потому что любой элемент может оказаться максимальным, а значит его придётся хотя бы прочитать. В стандартной библиотеке есть slices.Max, который делает ровно то же самое за O(n). 🐸 Библиотека Go для собеса
849
6
❓ Чем signal.NotifyContext отличается от signal.Notify signal.Notify — низкоуровневый примитив. Он перенаправляет сигналы в предоставленный канал, и приложение само обязано читать из него в горутине, обрабатывать значения и принимать решения.   signal.NotifyContext — обёртка поверх того же механизма, но интегрированная с context.Context. Получение сигнала автоматически отменяет контекст, и приложение работает через стандартный ctx.Done() — без ручного управления каналом.   На практике это важно, потому что большинство современных Go-библиотек принимают контекст: http.Server.Shutdown(ctx), sql.DB, gRPC-клиенты и т.д. signal.NotifyContext позволяет напрямую связать сигнал ОС с этими вызовами без дополнительного кода.   // signal.Notify — ручное управление ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT) go func() { <-ch // вручную инициировать завершение }()   // signal.NotifyContext — контекст сам распространяет отмену ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT) defer stop() server.Shutdown(ctx) // контекст отменится при SIGINT 🐸 Библиотека Go для собеса
1 053
7
❓ Что произойдёт, если не вызвать stop() после signal.NotifyContext   Внутри пакета signal ведётся реестр каналов, которым нужно доставлять сигналы. Пока stop не вызван, канал остаётся в этом реестре. Это означает две проблемы.   Первая — утечка ресурсов: внутренний канал не будет собран GC, даже если контекст уже отменён и никто его не использует.   Вторая — поведенческая: если программа перехватывает тот же сигнал в нескольких местах, лишние подписчики продолжат получать события, что может приводить к неожиданному поведению.   Правило простое: stop вызывается через defer сразу после создания контекста, независимо от того, был ли сигнал получен.   ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT) defer stop() // освобождает ресурсы в любом случае 🐸 Библиотека Go для собеса
971
8
❓ Что делает signal.NotifyContext(ctx, signals...) и что возвращает Функция принимает родительский контекст и список сигналов ОС, возвращает два значения: дочерний контекст и функцию stop.   Контекст отменяется автоматически, когда процесс получает один из перечисленных сигналов — например, syscall.SIGINT (Ctrl+C) или syscall.SIGTERM. После отмены ctx.Err() вернёт context.Canceled, а ctx.Done() будет закрыт.   Функция stop останавливает перенаправление сигналов и освобождает внутренние ресурсы пакета signal. Её нужно обязательно вызвать — как правило, через defer stop() сразу после создания контекста.   ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop()   <-ctx.Done() fmt.Println("получен сигнал:", ctx.Err()) 🐸 Библиотека Go для собеса
957
9
До 31 мая можно забрать любой курс Proglib Academy со скидкой 40% Если давно хотели прокачаться в Python, ML, алгоритмах или
До 31 мая можно забрать любой курс Proglib Academy со скидкой 40% Если давно хотели прокачаться в Python, ML, алгоритмах или AI-агентах, сейчас самое время выбрать программу и начать обучение по сниженной цене. 🎁 Разработка AI-агентов — от 49.000 ₽ (вместо 69.000 ₽) Практический курс по разработке AI-агентов для автоматизации задач, работы и собственных проектов 🎁 Курс AgentOps — 129.000 ₽ (вместо 149.000 ₽) Для разработчиков и LLM-инженеров, которые хотят внедрять AI-логику в бэкенд и сохранять стабильность сервиса. 🎁 Математика для разработки AI-моделей — 23.990 ₽ (вместо 31.990 ₽) Практическая база по математике для анализа данных, ML и дальнейшего развития в AI. 🎁 Математика для Data Science — от 29.990 ₽ (вместо 39.990 ₽) Курс для тех, кто хочет решать задачи, которые дают на собеседованиях на позицию дата-сайентиста в бигтехе. 🎁 ML для старта в Data Science — 28.990 ₽ (вместо 38.990 ₽) Разберётесь в машинном обучении: от базовых понятий и линейных моделей до ансамблей, бустинга и рекомендательных систем. 🎁 Основы IT для непрограммистов — 16.990 ₽ (вместо 28.990 ₽) Курс для IT-рекрутеров, маркетологов, проджектов, продактов и всех, кто работает с IT, но не пишет код. 🎁 Архитектуры и шаблоны проектирования — 27.990 ₽ (вместо 37.900 ₽) Освоите основные паттерны проектирования и прокачаете навыки архитектора программного обеспечения. 🎁 Специалист по ИИ — 89.000 ₽ (вместо 113.900 ₽) Курс для тех, кто хочет получить профессию в сфере ИИ, собрать портфолио из 5 проектов и научиться разрабатывать сложных AI-агентов. 🎁 Алгоритмы и структуры данных — 33.990 ₽ (вместо 57.990 ₽) Подготовитесь к алгоритмическим собеседованиям, разберёте структуры данных и научитесь писать более эффективный код. 🎁 Программирование на языке Python — 27.990 ₽ (вместо 47.390 ₽) Освоите Python на практике: без сухой теории, с пошаговой прокачкой навыков и итоговым проектом в портфолио. 🙌 Выбирайте курс по ссылке, оставляйте заявку, и менеджер поможет подобрать программу под ваши цели — https://clc.to/SALE40
926
10
❓ Как устроено внутреннее состояние sync.WaitGroup sync.WaitGroup содержит три поля: noCopy, state atomic.Uint64 и sema uint32. noCopy — маркер для go vet, запрещает копирование структуры после первого использования. В рантайме не занимает места. state — ключевое поле. В одном 64-битном слове упакованы два счётчика: старшие 32 бита — counter, количество незавершённых горутин, младшие 32 бита — waiter, количество горутин, заблокированных в Wait. Упаковка в одно слово нужна, чтобы атомарно обновлять оба значения за одну операцию и исключить гонку между Add и Wait. sema — системный семафор рантайма. Когда горутина вызывает Wait и counter > 0, она атомарно инкрементирует waiter и паркуется через runtime_Semacquire. Когда Add обнуляет counter, он делает runtime_Semrelease столько раз, сколько горутин ждёт. Done() — это просто Add(-1). Если после Add(delta) значение counter уходит в минус, рантайм паникует с "sync: negative WaitGroup counter". 🐸 Библиотека Go для собеса
908
11
📌 Что такое микросервисы в айти Микросервисы — это подход, при котором ваше приложение превращается в созвездие маленьких, независимых сервисов. Каждый живет своей жизнью, решает одну конкретную задачу и общается с «соседями» через API. Где мы это видим на практике: Онлайн-магазины: один сервис отвечает только за корзину, другой за оплату, третий «пинает» доставку. Если упала оплата, корзина всё еще работает. Стриминги (Netflix/YouTube): каталог фильмов, система рекомендаций и сам плеер это разные микросервисы. Поэтому рекомендации могут «тупить», но фильм всё равно будет играть. А что сейчас в вашем проекте? ❤️ — Уютный монолит (всё в одном месте, полёт нормальный) 🔥 — Микросервисный зоопарк 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🏃‍♀️ Азбука айтишника #ликбез
833
12
❓ Стоит ли стремиться к 100% покрытия кода тестами Нет. Высокий процент покрытия не гарантирует отсутствие багов. Тесты ради покрытия часто проверяют тривиальные вещи и усложняют поддержку. Важнее покрывать критическую бизнес-логику, граничные случаи и обработку ошибок. 🐸 Библиотека Go для собеса
1 104
13
❓ Как посмотреть покрытие кода тестами в Go   Запускаете тесты с флагом -cover для общей цифры. Для детального отчёта генерируете профиль и открываете его в браузере: go test -coverprofile=coverage.out go tool cover -html=coverage.out 🐸 Библиотека Go для собеса
1 221
14
❓ Что делает 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 для собеса
1 572
15
❓ В какой момент лучше сбрасывать состояние объекта в sync.Pool, при Get или при Put Оба варианта рабочие, но важно выбрать один и придерживаться его. Сброс при Get надёжнее, потому что гарантирует чистое состояние независимо от того, кто и как вернул объект в пул. Сброс при Put экономит время на стороне потребителя, но требует дисциплины от всех, кто кладёт объекты обратно. 🐸 Библиотека Go для собеса
1 536
16
❓ Вы случайно закоммитили в репозиторий файл с секретами. Как это исправить Простого удаления файла и нового коммита недостаточно, потому что секрет останется в истории. Нужно переписать историю через git filter-branch или git filter-repo, удалив файл из всех коммитов. После этого обязательно отозвать скомпрометированные ключи, потому что они могли быть уже скачаны. 🐸 Библиотека Go для собеса
1 683
17
❓ Гарантирует ли sync.Pool, что объект останется в пуле между вызовами GC Нет. Сборщик мусора может в любой момент очистить содержимое пула. sync.Pool не даёт гарантий на время жизни объектов. Поэтому его нельзя использовать как кэш или хранилище. 🐸 Библиотека Go для собеса
1 611
18
❓ Когда использовать функции вместо интерфейсов Ключевой критерий это количество методов в поведении. Если нужно абстрагироваться над одним действием, берите функцию-тип. Если поведение требует нескольких связанных методов — интерфейс. Интерфейс оправдан, когда поведение требует нескольких связанных методов или когда реализация несёт внутреннее состояние — соединение, кэш, буфер. Тогда контракт нужно зафиксировать явно, и интерфейс делает это лучше. Показательный пример из стандартной библиотеки — net/http. Там оба подхода живут рядом: • http.Handler — интерфейс с одним методом ServeHTTP • http.HandlerFunc — функциональный тип, который реализует этот же интерфейс. Это позволяет передавать как структуры со состоянием, так и простые функции, не заставляя автора каждый раз писать обёртку. 🐸 Библиотека Go для собеса
1 707
19
❓ Можно ли складывать два разных алиаса на один и тот же тип Алиас в Go это другое имя для существующего типа. Когда пишут type Meters = float64, компилятор не создаёт новый тип: Meters и float64 взаимозаменяемы без явного приведения. Компилятор видит оба алиаса как float64 и не различает их. Поэтому сложение, сравнение и передача в функцию работают без приведения типов. Если функция принимает Seconds, в неё без ошибки пройдёт переменная типа Meters. 🐸 Библиотека Go для собеса
1 507
20
👣 Хотите вкатиться в разработку с нуля? Рассмотрите Golang, изучите одну из важных тем языка 📚 На открытом уроке разберём,
👣 Хотите вкатиться в разработку с нуля? Рассмотрите Golang, изучите одну из важных тем языка 📚 На открытом уроке разберём, как устроена типизация в Go, как работают указатели и где хранятся данные — стек, куча или статическая память. Покажем на примерах, как язык управляет памятью и почему это влияет на производительность. Урок проходит в преддверии старта курса «Go-разработчик. Базовый уровень». Если вы хотите разобраться в базовых механизмах языка и писать код без скрытых ошибок — подключайтесь 🤓Встречаемся 21 мая в 20:00 МСК. Регистрация открыта: https://clc.to/0zzq6Q Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
0