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

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

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

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

Наши каналы: https://t.iss.one/proglibrary/9197
Download Telegram
Расскажите подробнее про работу syncOnce

sync.Once в Go обеспечивает выполнение функции ровно один раз даже при конкурентных вызовах из множества горутин, используя атомарное поле done типа atomic.Bool и мьютекс.

При вызове Do(f) сначала проверяется o.done.Load() — если флаг true, метод сразу возвращается без выполнения f. Это оптимизировано для горячего пути: поле done размещено первым в структуре для минимизации инструкций на amd64/386. Неправильная реализация только с CompareAndSwap привела бы к гонке данных, где вторая горутина вернулась бы до завершения f первой.

Если done равно false, вызывается doSlow(f): захватывается мьютекс o.m.Lock(), повторно проверяется done, и только тогда выполняется f() с отложенной установкой o.done.Store(true). Это гарантирует, что f запустится ровно раз, а все последующие вызовы дождутся завершения. Если f паникует, Do считает задачу выполненной, и будущие вызовы пропускают её.

🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
4😁1
Как ведёт себя select без case

В Go выражение select {} без блоков case — это бесконечная блокирующая операция. Это означает, что текущая горутина навсегда застрянет в ожидании какого-либо события, которого при этом нет.

Такой вызов часто используется для удержания основной горутины живой, чтобы программа не завершилась, например в серверных приложениях, где запущены другие горутины, и нужно, чтобы главный поток ждал их бесконечно:
func main() {
go doSomething()
select {}
}


🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍32😁1
Какая разница между пустым select и пустым for

Это два способа создания бесконечного цикла, но они кардинально отличаются по поведению и потреблению ресурсов.

select {} — горутина блокируется навсегда, не потребляет CPU потому что горутина паркуется runtime'ом.

for {} — это бесконечный цикл, 100% CPU одного ядра потому что постоянно проверяет условие цикла.

🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Зачем в появились errors.Is и errors.As, если уже есть сравнение err == someErr

errors.Is и errors.As нужны для корректной работы с обёрнутыми ошибками, когда err содержит не просто константу, а стек контекста.

Обычное сравнение err == someErr работает только если:

• err указывает ровно на ту же ошибку, что и someErr.

• ошибка не была обёрнута через fmt.Errorf("%w", err) или аналогичные механизмы.

Как только добавляется контекст fmt.Errorf("read config: %w", err), внешнее значение меняется, и == уже не срабатывает, хотя внутри всё ещё лежит исходная ошибка.

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

errors.Is разбирает цепочку обёрнутых ошибок и проверяет, эквивалентна ли какая‑то ошибка внутри этой цепочки целевой ошибке.

Функция errors.Is вызывает Unwrap у ошибки, если она его реализует и проходит по всей цепочке обёрток, пока не найдёт совпадение по ==, либо через метод Is, если он реализован у ошибки.

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

errors.As проходит по цепочке обёрнутых ошибок и пытается найти в ней значение, которое можно привести к заданному типу, записывая найденную ошибку в переданный указатель и возвращая true при успехе.

Функция вызывается как errors.As(err, &target), где target — указатель на переменную интерфейсного или конкретного типа ошибки, например, *os.PathError.

Внутри она разворачивает ошибку через Unwrap, проверяя каждое звено цепочки на возможность присваивания в target по правилу совместимости типов.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2
В чём разница между errors.Is и errors.As

errors.Is(err, target) — проверяет, встречается ли где‑то внутри обёрток ошибка target по значению.

errors.As(err, &target) — ищет внутри обёрток ошибку определённого типа и, если находит, кладёт её в target.

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍43🥱2
Что делают json.Marshal и json.MarshalIndent, чем они отличаются

json.Marshal и json.MarshalIndent оба кодируют значение в JSON, но Marshal выдаёт компактный JSON в одну строку, а MarshalIndentчеловекочитаемый JSON с отступами и переводами строк.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Избегай Race Condition в карьере

Пока другие учат только синтаксис Go, ты можешь освоить архитектуру высоконагруженных систем. На собеседованиях в BigTech смотрят не на то, как ты пишешь if err != nil, а на то, как ты строишь взаимодействие сервисов.

Оффер 1 + 2:

Покупаешь один курс (основной), получаешь доступ к трем.

Мастхэв для гофера:

— Архитектуры и шаблоны проектирования;
— Алгоритмы и структуры данных.

Задеплоить знания

Таймаут: 31 декабря.
Ментор здесь: @manager_proglib
Как с помощью тегов json:"..." управлять именами полей, пропуском полей и именами с разным регистром при маршалинге

Теги json:"..." — это подсказки для пакетa encoding/json, как именно записывать поля структуры в JSON.

Без тегов Go сам придумывает имя поля в JSON из имени поля структуры: Name"Name", UserID"UserID".

Изменение имени поля:
type User struct {
Name string `json:"name"`
Email string `json:"email_address"`
}


Полностью скрыть поле («-»):
type User struct {
Name string `json:"name"`
Password string `json:"-"`
}


Password вообще не появится в JSON.

Пропускать пустые поля (omitempty):
type User struct {
Name string `json:"name"`
Email string `json:"email,omitempty"`
}


🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Как json.Marshal обрабатывает экспортируемые и неэкспортируемые поля структуры

json.Marshal кодирует в JSON только экспортируемые поля структуры и игнорирует неэкспортируемые, даже если для них указаны теги.

Теги json:"..." не делают поле видимым для json.Marshal, если оно неэкспортируемое.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

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

При маршалинге анонимные структуры разворачиваются в один общий JSON-объект, но при конфликте имён действует правило приоритета: явные теги выигрывают, при прочих равных побеждает поле из более внешнего уровня.

Конфликт имён без тегов

type A struct {
Name string
}
type B struct {
Name string
}
type C struct {
A
B
}


У C два поля Name на одном уровне вложенности, и json.Marshal не сможет выбрать однозначно: такое поле считается конфликтным и пропускается.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Как маршалятся в JSON разные типы: string, int, float64, bool, slice, map, struct, nil

Базовые типы

• string → JSON-строка: "hello""hello".

​• int, uint, float64 и т.п. → JSON-число: 42, 3.14.

​• bool → JSON-логическое: true / false.

— Срезы и массивы


• slice/array → JSON-массив: []int{1, 2}[1,2].

​• Срез строк → []string{"a", "b"}["a","b"].

Мапы

map[string]T → JSON-объект: {"a":1}.

Ключи должны быть строками, целыми числами или должны реализовать TextMarshaler. Для других типов ключей Marshal вернёт ошибку.

Структуры

• struct → JSON-объект с полями: экспортируемые поля становятся полями JSON по имени или по тегу json:"...".

Вложенные и embedded-структуры разворачиваются в соответствующие вложенные объекты/поля. ​

nil

• nil интерфейс, nil slice/map/pointer → JSON null, если само значение маршалится напрямую.

При этом nil-срез кодируется как null, а не как [], если только вы отдельно не инициализируете его пустым.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Влияет ли MarshalIndent только на форматирование, или может менять порядок полей/значения по сравнению с Marshal

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

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

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

Собственный формат сериализации задаётся реализацией интерфейса json.Marshaler — то есть методом MarshalJSON() ([]byte, error) у типа.

Это нужно, когда стандартное поведение encoding/json не подходит: особый формат даты, обёртка, маскирование.

Пример:
func (t MyTime) MarshalJSON() ([]byte, error) {
// хотим формат "YYYY|MM|DD"
s := t.Format("2006|01|02")
return json.Marshal(s)
}


🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥91👍1🥱1
ЭТОТ ПОСТ СПАСЕТ ТВОЙ 👩‍💻-СОБЕС

В наше время очень тяжело попасть на собеседование! Поэтому предлагаем вам очень серьезно относиться к ним.
Не упускайте не единое собеседование, готовьтесь к каждому, как к последнему.
Регулярно проверяйте свои hard-skills.
Забирай чек-лист из закрепленного сообщения - 55 вопросов из реальных собесов!

P.S. помимо непосредственно GO, разбираем другие необходимые технологии, про них нельзя забывать!

Помни, что каждое собеседование в 2025 на вес золота!

Реклама. Заимкин Святослав Валерьевич, ИНН 781430725000. Erid 2VtzqvB5FRL
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1🥰1
Какие параметры принимает json.MarshalIndent, что означают prefix и indent

json.MarshalIndent принимает те же данные, что и Marshal, плюс два строковых параметра prefix и indent, которые управляют только форматированием человекочитаемого JSON.

prefix — строка, которая ставится в начале каждой строки JSON. Обычно пустая, иногда используют для логов.

indent — строка для каждого уровня вложенности: например " " или "\t"

Во всех случаях prefix и indent не влияют на порядок полей и значения, только на внешний вид текста JSON.

🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что произойдёт, если тип реализует MarshalJSON, но внутри MarshalJSON сделать рекурсивный вызов json.Marshal над самим собой без обёрток

Если внутри MarshalJSON вызвать json.Marshal на значении того же типа без обёртки, получится бесконечная рекурсия и в итоге паника по переполнению стека.

Как делать правильно

Нужно маршалить не самого себя, а сырой тип без метода, например type alias или обёртку, либо вспомогательную структуру/тип, у которого нет MarshalJSON.

Пример безопасного варианта:
type User struct {
Name string
}

func (u User) MarshalJSON() ([]byte, error) {
type plain User // alias без методов
return json.Marshal(plain(u))
}


🎁 Новогодняя акция: 3 курса по цене 1
🤝
Помощь с выбором курса

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