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

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

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

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

Наши каналы: https://t.iss.one/proglibrary/9197
Download Telegram
Опишите, как можно эффективно хранить и обрабатывать список пользователей, зарегистрировавшихся на хэллоуинскую вечеринку, чтобы избежать дублирования

Можно использовать тип данных map с ключами, например, по уникальному идентификатору пользователя: email, username или ID.

При конкурентных обращениях использовать sync.Map или мьютексы для защиты мапы.

Если нужно сохранять пользователей в базе данных — использовать уникальные индексы на уровне БД.

При необходимости фильтрации или поиска по другим полям — можно создавать дополнительные мапы или индексы.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🌚2
Как происходит передача значений в функции, вызовы которых отложены с помощью defer

В Go аргументы функции, вызванной с помощью defer, вычисляются сразу в момент объявления defer, а не во время выполнения самой отложенной функции. Это значит, что значения, переданные в defer, фиксируются на момент объявления, даже если переменные потом изменятся.

Сам вызов функции с defer будет выполнен уже после завершения текущего блока кода или функции, но с теми значениями аргументов, которые были на момент вызова defer.

Пример:
package main

import "fmt"

func main() {
x := 10
defer fmt.Println("До:", x) // x вычисляется сейчас, но вывод откладывается
x = 20
fmt.Println("После:", x)
}


Выведется 20 и 10, потому что значение x для defer зафиксировалось при объявлении defer, а не к моменту выполнения отложенной функции.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3😁2
У вас есть массив чисел, в котором все числа встречаются по два раза, кроме одного — уникального, которое встречается один раз. Как вы бы решили эту задачу используя операцию XOR

Суть метода в свойствах XOR:

• Любое число XOR с самим собой дает 0:
a⊕a = 0
a⊕a = 0
.

• Любое число XOR с нулем дает само число:
a⊕0 = a
a⊕0 = a
.

• Операция XOR коммутативна и ассоциативна, то есть порядок операндов не важен.

Поэтому если последовательно применить XOR ко всем элементам массива, пары одинаковых чисел взаимно отменяются и останется только уникальное число.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🤩1
В чем практические и внутренние различия между буферизованными и небуферизованными каналами

Небуферизованный канал — строгий. Отправка и прием завершаются одновременно и образуют отношение happens-before между записью и чтением значения.

Буферизованный канал хранит элементы в кольцевом буфере внутри структуры до выборки получателем. Отправитель блокируется лишь при полном буфере.

При небуферизованном обмене с ожидающим получателем значение копируется напрямую из стека отправителя в стек получателя, минуя промежуточный буфер. При буферизованном — сначала в буфер канала, затем из буфера в стек получателя.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
Зачем нужен канал с размером 1

Канал с размером буфера 1 — это своего рода «промежуточный» вариант между небуферизованным и традиционно буферизованным каналом. Он позволяет одному элементу находиться в канале без блокировки отправителя, то есть:

Если буфер пуст, то отправитель записывает значение в буфер и сразу продолжает работу, не блокируясь. Это даёт асинхронность, в отличие от небуферизованного канала, где send блокирует до приёма значения.

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Какова алгоритмическая сложность обращения к мапе

Обращение к элементу в мапе работает за константное время, потому что Go использует хеш-таблицу. Ключ хешируется, и по значению хеша система сразу указывает на нужный бакет в памяти.

При переаллокации данных сложность может деградировать до O(n).

Это происходит, когда количество элементов в мапе превышает load factor, примерно 6,125 элементов на баккет в среднем, или около 81% заполненности. Тогда Go выделяет новую память под бакеты в два раза больше и постепенно переносит данные из старых бакетов в новые.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
На что действует load factor — на всю мапу или на отдельные бакеты

На всю маппу в целом. Load factor — это среднее значение заполненности всех бакетов. Некоторые бакеты могут быть заполнены меньше, другие больше, но когда в среднем количество элементов на бакет превышает примерно 6,125 элементов, запускается эвакуация. Это не локальное свойство одного бакета, а глобальное состояние всей мапы.

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

Максимума нет — бакет может расти бесконечно. Каждый бакет состоит из восьми слотов, но если в одном бакете происходит коллизия, элементы образуют цепочку. Эта цепочка может расти сколько угодно. Однако когда общий load factor превышает лимит, вся мапа переалоцируется, чтобы уменьшить количество коллизий.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔2
За что отвечает второй аргумент в make при создании мапы

Это подсказка на желаемое количество элементов.
myMap := make(map[string]int, 3)


Второй параметр говорит Go, сколько элементов вы планируете хранить. Это не резервирует точное количество памяти и не ограничивает мапу. Go использует эту подсказку для предварительного выделения бакетов, чтобы избежать лишних переалокаций на начальном этапе.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
От чего зависит размерность int

Go автоматически выбирает размерность в зависимости от платформы, на которой компилируется программа. Если нужен строго определённый размер, используйте явные типы: int32, int64, uint32, uint64.

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥174👍4🥱2
Как использовать алиасы и какие кейсы использования знаете

Алиасы создаются с помощью ключевого слова type и позволяют дать новое имя уже существующему типу. Они не создают новый тип, а лишь создают альтернативное имя для существующего типа.

Основные кейсы использования алиасов:

• Если имя пакета или типа слишком длинное, алиас позволяет использовать сокращённое имя для удобства и читаемости

• При импорте двух пакетов с одинаковыми именами, алиасы используются для различия
import (
sqlDB "project/sql/db"
nosqlDB "project/nosql/db"
)


• Если в новой версии библиотеки типы были переименованы или перемещены, алиасы позволяют сохранить старые имена без изменения основного кода.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
Можно ли присвоить значение типа-алиаса значению оригинального типа

Да, можно. Алиас в Go — это другое имя для того же типа, а не новый тип. Поэтому значения типа-алиаса и оригинального типа полностью совместимы и могут присваиваться друг другу без приведения.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
Возможно ли использовать алиасы для встроенных типов, таких как int, string

Да, алиасы можно создавать для любых типов, включая встроенные). Это делают для улучшения читаемости кода или для придания типам семантического смысла, например, type UserID = int.

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

Нет, алиасы не влияют на производительность, так как они не создают новых типов и не меняют структуру данных.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3😁1
Что такое паттерн fan-out

Fan-out — это паттерн, при котором поток генерирует несколько горутин, чтобы повысить производительность и использовать многопоточность.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤‍🔥2💯2
В чем состоит идея паттерна fan-in

Fan-in — это паттерн обратный fan-out, когда результаты множества параллельных горутин собираются в один канал или поток для дальнейшей обработки.

Реализация паттерна в Go часто использует каналы и sync.WaitGroup: каждая горутина пишет свои результаты в общий канал, а после завершения всех горутин канал закрывается основной горутиной.

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥10👍3
В чем ключевые моменты организации сбора и агрегации ошибок от горутин в fan-in реализации

Ошибки нужно передавать через отдельный канал или включать в структуру результата. В Go есть пакет errgroup, который объединяет синхронизацию горутин и агрегирует ошибки.

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

• Количество активных горутин.
• Задержки в обработке (latency).
• Время выполнения горутин.
• Использование CPU и памяти.
• Ошибки и тайм-ауты.
• Очередь ожидания в каналах.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
Media is too big
VIEW IN TELEGRAM
🔥 Закрой пробелы в математике за 8 недель

Валишься на вопросах про математику на собесах?

Proglib Academy запускает курс «Математика для Data Science», чтобы помочь тебе получить вакансию мечты!

🔎 Тебя ждут:

→ топовые эксперты, один из них на видео — Мария Тихонова. Мария — кандидат компьютерных наук, руководитель исследовательского направления SberAI, доцент факультета компьютерных наук и преподаватель НИУ ВШЭ;
→ живые вебинары, на которых можно задать вопросы спикерам;
→ доступ к материалам в записи, если не успели на лекцию и чат;
→ 3 задания с практикой на Python и финальный проект с подробной обратной связью от экспертов курса;
→ актуальные знания: программа разработана в ноябре 2025г;
→ программа без воды — 2 месяца только самого нужного для старта.

👉 Пройди короткий тест и узнай свой уровень математики.

Приятные бонусы:

🎁 скидка 40% до 30 ноября;
🎁 оплати до конца ноября → курс «Школьная математика» в подарок.

🔗 Подробнее о курсе