Библиотека Go для собеса | вопросы с собеседований
6.92K 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
Как замаршалятся анонимные/встраиваемые структуры и поля с тегами, если в иерархии есть конфликт имён

При маршалинге анонимные структуры разворачиваются в один общий 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