Библиотека Go для собеса | вопросы с собеседований – Telegram
Библиотека Go для собеса | вопросы с собеседований
7.02K subscribers
254 photos
10 videos
1 file
630 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://news.1rj.ru/str/proglibrary/9197
Download Telegram
Какая разница между пустым select и пустым for

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

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

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Зачем в появились 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
🔥15👍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
👍1
Как реализовать собственный формат сериализации для типа и когда это нужно

Собственный формат сериализации задаётся реализацией интерфейса 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
👍41
Как вам вопросы прошедшей недели

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥113👍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
👍1
Что произойдёт, если тип реализует 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
👍3
Есть ли гарантия порядка полей в результирующем JSON и нужно ли на него полагаться

Порядок полей в JSON формально не гарантируется и полагаться на него не стоит.

Для struct encoding/json на практике выводит поля в порядке, заданном в определении типа, но это деталь реализации, а не контракт, прописанный в спецификации JSON или строгом API пакета.

Для мап порядок ключей в JSON принципиально не определён: обход мапы в Go сам по себе недетерминирован.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
В чём разница между runtime.GC() и GOGC=off

Функция runtime.GC() принудительно запускает цикл сборки мусора и блокирует вызывающий горутины до завершения.

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

Переменная окружения GOGC=off полностью отключает автоматический сборщик мусора, эквивалентно установке GOGC в бесконечность.

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
WANTED: GO-ДОПРОСИТЕЛЬ

Обвиняется в глубоком знании планировщика и умении объяснить работу каналов на пальцах. Пора перестать копить знания в приватных чатах — выходи на большую аудиторию.

Приметы:

— профессионально пишет на Golang (знает, чем он отличается от Java и Python);
— понимает, что на самом деле спрашивают на интервью в бигтех-компаниях;
— обладает талантом методиста и наставника;
— готов монетизировать свой опыт через создание качественного контента.

Условия:

— статус эксперта в Proglib Academy;
— достойная оплата за участие в проектах;
— мощный PR твоего имени в IT-среде.

Признаться во всём

P.S. Твой техлид — Gopher со стажем? Сдай его следствию.
Когда использовать debug.SetGCPercent

debug.SetGCPercent используется для динамической настройки порога запуска сборщика мусора во время выполнения программы, в отличие от статической переменной GOGC.

SetGCPercent(200) снижает частоту GC, но увеличивает память.

SetGCPercent(50) запускает GC чаще с короткими паузами.

SetGCPercent(-1) полностью отключает автоматическую сборку мусоры, это эквивалентно GOGC=off, память растёт без ограничений.

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

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