Библиотека Go для собеса | вопросы с собеседований
6.86K subscribers
218 photos
6 videos
1 file
410 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Как работает sync.WaitGroup?

1️⃣ Создаётся экземпляр sync.WaitGroup, который отслеживает количество горутин.
2️⃣ Перед запуском горутин вызывается метод Add(n), где n — количество горутин, которые нужно отследить.
3️⃣ Внутри каждой горутины вызывается метод Done(), который уменьшает счётчик WaitGroup на 1 после завершения работы.
4️⃣ Основной поток вызывает метод Wait(), который блокируется до тех пор, пока счётчик не станет равным нулю.
Please open Telegram to view this post
VIEW IN TELEGRAM
👏9🥱2
Чем отличаются crypto/rand и math/rand? Когда использовать каждый из них?

Цель и применение:
crypto/rand: Предназначен для генерации криптографически стойких случайных чисел. Используется в задачах, связанных с безопасностью, где важно исключить возможность предсказания результата.
math/rand: Предоставляет генератор псевдослучайных чисел, который быстрее, но менее стойкий к предсказанию. Используется в сценариях, где безопасность не критична, например, для симуляций, тестов или игровых алгоритмов.

Генератор случайных чисел:
⚙️ crypto/rand: Использует системный источник случайности (например, /dev/urandom в Linux или CryptGenRandom в Windows). Это делает его надежным, но медленным.
⚙️ math/rand: Использует алгоритм генерации псевдослучайных чисел, который основывается на фиксированном начальном значении (seed). Повторение одинакового сида приводит к генерации одинаковой последовательности чисел.

Предсказуемость:
⚙️ crypto/rand: Случайные числа практически невозможно предсказать.
⚙️ math/rand: Если известен seed, последовательность чисел легко воспроизвести.
👍91🔥1
Как работать с временно неиспользуемыми переменными?

Если переменная временно не используется, её можно явно игнорировать с помощью _ (пустого идентификатора). Это указывает на то, что разработчик осознанно отказывается от значения.
👍3
Новый год — время для новых начинаний!
Пока все строят планы на будущее, подумайте, что поможет вам двигаться вперёд в карьере. Мы знаем, что навыки в IT открывают огромные возможности — и мы готовы помочь вам начать!

🔹 Почему IT?

- Большинство компаний активно ищут специалистов.
- Вы можете работать из любой точки мира — с гибким графиком и интересными задачами.
- А ещё IT — это высокий доход и стремительный карьерный рост.

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

📚 Как это работает?

- Несколько программ по цене одной — выбирайте всё, что вам нужно.
- Бессрочный доступ — учитесь в своём ритме и когда удобно.
- Это выгодно — вы получаете навыки, которые помогут вам расти профессионально и зарабатывать больше.

А для тех, кто решит сделать шаг в будущее до конца года, у нас есть кое-что особенное… 🎁 Узнайте больше

Как выбрать свой путь?
Мы предлагаем несколько уникальных комбинаций курсов, которые помогут вам стать настоящим экспертом:

🔵 Математика для Data Science + Алгоритмы и структуры данных — для тех, кто хочет готовиться к собеседованиям в топовые компании.

🔵 Алгоритмы + ML — чтобы не просто решать задачи, а понимать, как работают современные технологии.

🔵 Frontend + ML — создавайте приложения и учитесь работать с нейросетями.

🔵 И другие комбинации для разных целей.

Новогодний подарок, который будет работать на вас весь год — это отличная идея! 🎁 Начните сейчас

Развивайтесь в IT — и будущее уже будет в ваших руках!
👍1
Что делает функция io.TeeReader? Приведите примеры использования

Функция io.TeeReader из пакета io создаёт Reader, который выполняет двойную работу:
1️⃣ Читает данные из исходного io.Reader.
2️⃣ Одновременно записывает эти данные в заданный io.Writer.

Иными словами, она «разветвляет» поток данных: каждый байт, который читается, также записывается в другой поток, указанный через io.Writer.

Где может быть полезен io.TeeReader?

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

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

Создание копий данных:
Например, при загрузке файла вы можете сохранить копию на диск и одновременно передать её в сетевой поток.

Диагностика и отладка:
Можно использовать TeeReader для перехвата и анализа данных в реальном времени.
👍11
Почему в Go функции всегда возвращают error, даже если оно равно nil?

В Go функции всегда возвращают error, чтобы обеспечить явную обработку ошибок. Даже если error == nil, его наличие заставляет разработчика проверить результат выполнения. Это делает код предсказуемым, читабельным и снижает вероятность игнорирования ошибок, сохраняя простоту интерфейса и гибкость дизайна функций.
👍11🥱6🌚1
🤨 Как сравнить два слайса в Go?
В Go для сравнения двух слайсов нужно вручную или с помощью готовых решений проверить их содержимое, так как оператор == не поддерживает сравнение слайсов

1️⃣ Через циклы
func slicesEqual(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}


2️⃣ Библиотека reflect
import "reflect"

func slicesEqual(a, b []int) bool {
return reflect.DeepEqual(a, b)
}


3️⃣Использование cmp из google/go-cmp
Для более сложных сравнений, например, со структурой или кастомными правилами:
import (
"fmt"
"github.com/google/go-cmp/cmp"
)

func main() {
slice1 := []int{1, 2, 3}
slice2 := []int{1, 2, 3}

fmt.Println(cmp.Equal(slice1, slice2)) // true
}


4️⃣Сравнение через сериализацию (для сложных данных)
import (
"encoding/json"
"log"
)

func slicesEqualJSON(a, b []int) bool {
aJSON, _ := json.Marshal(a)
bJSON, _ := json.Marshal(b)
return string(aJSON) == string(bJSON)
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🙏2
Что такое iota и как он работает в Go?

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

const (
A = iota // 0
B = «Hello» // Переопределение строки
C = iota // 2 (счёт продолжается)
D = 100 // Явное значение
E = iota // 4
)

Когда в блоке const происходит явное переопределение значений, поведение iota остаётся последовательным, но его значение продолжает увеличиваться на каждой строке, независимо от того, используется ли iota явно или задаются другие значения вручную.
👍131😢1
Что такое «магическая дата» в Go?

«Магическая дата» в Go — это фиксированная дата и время: 2006-01-02 15:04:05, выбранная для демонстрации форматов даты и времени. Она служит эталоном для указания шаблонов при работе с функциями форматирования и парсинга времени.

Почему выбрана именно эта дата?
Go использует числовую комбинацию, отражающую порядок элементов даты и времени:
2006 — год, состоящий из 4 цифр.
01 — месяц.
02 — день.
15 — часы в 24-часовом формате.
04 — минуты.
05 — секунды.

Из этой даты получается набор цифр — 1,2,3,4,5,6
🤔11👍6
Может ли одна горутина заблокировать мьютекс, а другая его разблокировать?

Мьютексы в Go не отслеживают, какая конкретно горутина вызвала Lock или Unlock. Это означает, что мьютекс может быть заблокирован одной горутиной и разблокирован другой. Такое поведение допускается на уровне реализации, чтобы мьютексы были максимально простыми и эффективными.
Однако это крайне не рекомендуется, так как приводит к сложностям в управлении состоянием мьютекса и повышает риск возникновения ошибок.
👍24
В каких случаях деление на ноль в языке Go не приводит к панике (panic), и какой результат возвращается в этих случаях?

Деление на ноль в Go не приводит к панике в случаях, когда используются числа с плавающей запятой (float64). В зависимости от знака делимого, результат будет:
Положительное число делится на ноль: результатом будет положительная бесконечность (+Inf).
Отрицательное число делится на ноль: результатом будет отрицательная бесконечность (-Inf).
Ноль делится на ноль: результатом будет «not-a-number» (NaN).
👍21❤‍🔥1
🎨 Новый канал для вдохновения — UX in GIF

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

📌 Чем полезен канал?

→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.

👉 Подписывайтесь и вдохновляйтесь: UX in GIF
Please open Telegram to view this post
VIEW IN TELEGRAM
🗺 Привычка "срезать углы" при ходьбе – это интуитивное применение алгоритмов?

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

С нашим курсом «Алгоритмы и структуры данных» вы научитесь решать любые сложные задачи так же эффективно.

🎄Начните свой 2025 со скидкой 35% на все курсы. Это лучшее вложении уходящего года – https://proglib.io/w/014fe6d8
Что произойдет, если в defer использовать анонимную функцию, изменяющую внешнюю переменную?

Изменения произойдут в момент выполнения отложенной функции (а не в момент ее определения)
😢3
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
1👍1
Как проверить, пуст ли интерфейс (interface{})?

Интерфейс (interface{}) в Go считается пустым, только если его значение и тип равны nil. Для точной проверки можно использовать reflect.ValueOf(i).IsZero(), чтобы учесть случаи с nil-значением, но заданным типом.

📎 Подробнее можно почитать здесь
👍8😢1
Можно ли модифицировать map внутри цикла range? Почему?

Нет, модифицировать map во время итерации через range в Go нельзя, так как это может привести к панике (runtime panic). В документации языка указано, что параллельное изменение карты во время итерации не допускается, поскольку внутренняя структура map в Go не поддерживает такие операции.

Причина заключается в том, что изменение map во время итерации может нарушить внутреннюю структуру данных, вызывая неконсистентность или некорректное поведение.
👍8
Чем отличается память в куче от памяти в стеке?

Память в стеке:
Используется для хранения данных с коротким временем жизни (локальные переменные функции).
Быстро выделяется и освобождается, поскольку происходит по принципу LIFO (Last-In-First-Out).
Управляется автоматически при выходе из области видимости функции.
Ограничена по размеру.

Память в куче:
Используется для объектов, срок жизни которых не определён заранее.
Выделение и освобождение сложнее и медленнее, так как управляется сборщиком мусора (GC).
Не ограничена жёсткими рамками, зависит от доступной оперативной памяти.
Подходит для глобальных и длительно живущих объектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱10👍21😁1
Что такое GOGC?

GOGC (Garbage Collection Goal) — это переменная окружения или настройка, управляющая частотой работы сборщика мусора в Go. GOGC определяет процентный прирост памяти, который допускается перед запуском очередного цикла GC.

Значение GOGC:
100 (по умолчанию): GC запускается, когда используемая память увеличивается на 100% по сравнению с памятью, оставшейся после последнего цикла GC.
0: отключает автоматическую сборку мусора.
<100: увеличивает частоту работы GC (более агрессивная сборка).
>100: снижает частоту работы GC (редкие сборки).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12