Структуры и методы

15 вопросов

Структуры - основной способ организации данных в Go. Методы с value и pointer receiver, встраивание (embedding) вместо наследования, теги полей для JSON и других форматов.

1 Какой zero value у поля Name string в новой структуре? 🟢 Лёгкий
Ответ: B) ""

При создании структуры без инициализации (User{} или var u User) все поля получают zero value своего типа. Для string это "". Для int - 0, для *T - nil.

Подробнее →
2 Как экспортировать поле структуры? 🟢 Лёгкий
Ответ: B) Названием с заглавной буквы

В Go видимость определяется регистром первой буквы. Name - экспортировано (доступно из других пакетов), name - приватное. Это касается полей, методов, функций, типов, констант и переменных.

Подробнее →
3 Какое ключевое ограничение у value receiver по сравнению с pointer receiver? 🟢 Лёгкий
Ответ: B) Value receiver не может изменить поля структуры

Value receiver получает копию структуры - изменения полей не видны вызывающей стороне. Pointer receiver работает с оригиналом. Если хотя бы один метод имеет pointer receiver, все рекомендуется делать pointer receiver. Pointer receiver также избегает копирования больших структур.

Подробнее →
4 Можно ли в Go наследовать структуры? 🟡 Средний
Ответ: B) Нет, но есть встраивание (embedding)

В Go нет наследования. Вместо этого есть композиция через встраивание (embedding): type Dog struct { Animal }. Методы встроенного типа "продвигаются" и доступны напрямую, но это не наследование - нет полиморфизма через базовый тип.

Подробнее →
5 Чем отличается метод с pointer receiver от value receiver? 🟡 Средний
Ответ: B) Pointer receiver может изменять структуру

Value receiver (func (s MyStruct) Method()) получает копию - изменения не сохранятся. Pointer receiver (func (s *MyStruct) Method()) получает указатель - может менять поля оригинала. Также pointer receiver эффективнее для больших структур.

Подробнее →
6 Что такое embedding (встраивание) в Go? 🟡 Средний
Ответ: B) Включение типа без имени поля

Встраивание - объявление типа внутри структуры без имени поля: type Manager struct { Employee }. Все поля и методы Employee доступны напрямую через Manager. Это композиция, не наследование.

Подробнее →
7 Можно ли сравнивать структуры оператором ==? 🟡 Средний
Ответ: B) Только если все поля сравнимы

Структуры сравнимы, если все их поля сравнимы. Если структура содержит слайс, map или функцию - сравнение через == невозможно (ошибка компиляции). Структура из int, string, bool - сравнима.

Подробнее →
8 Что делает тег json:"name,omitempty" у поля структуры? 🟡 Средний
Ответ: B) Задаёт имя в JSON и пропускает пустые значения

Теги - метаданные, доступные через рефлексию. json:"name" задаёт имя поля при сериализации/десериализации JSON. omitempty - пропускает поле, если оно имеет zero value (0, "", nil, false).

Подробнее →
9 В чём разница между type A = int и type A int? 🟡 Средний
Ответ: B) A = int - алиас (тот же тип), A int - новый тип

type A = int - алиас типа (Go 1.9+), A и int - один и тот же тип, полностью взаимозаменяемы. type A int - определение нового типа, A и int несовместимы без явного приведения. На новый тип можно навешивать методы, на алиас нельзя (если базовый тип из другого пакета).

Подробнее →
10 В чём опасность Point{1, 2} вместо Point{X: 1, Y: 2}? 🟡 Средний
Ответ: B) Добавление нового поля в структуру сломает код

При позиционных литералах Point{1, 2} добавление нового поля (Z int) вызовет ошибку компиляции - недостаточно аргументов. С именованными Point{X: 1, Y: 2} код продолжит работать - Z получит zero value. go vet предупреждает о позиционных литералах из других пакетов.

Подробнее →
11 Что даёт встраивание (embedding) структуры в Go? 🟡 Средний
Ответ: B) Продвижение (promotion) полей и методов встроенного типа

Embedding продвигает поля и методы - к ним можно обращаться напрямую. Это композиция, не наследование: нет полиморфизма, нет override. При конфликте имён нужно обращаться через имя типа. Go следует принципу 'composition over inheritance'.

Подробнее →
12 Что произойдет, если внешняя структура определяет метод с тем же именем, что и встроенная? 🟡 Средний
Ответ: B) Метод внешней структуры затеняет (shadows) метод встроенной; для вызова встроенного нужно обратиться к нему явно через имя встроенного типа

Метод внешней структуры имеет приоритет (затеняет встроенный). Встроенный метод доступен через явное обращение: outer.EmbeddedType.Method().

Подробнее →
13 Сколько памяти занимает значение struct{}{}? 🔴 Сложный
Ответ: C) 0 байт

Пустая структура struct{} занимает 0 байт. Используется для signal-каналов (chan struct{}), множеств (map[string]struct{}) и маркеров. Все значения struct{} указывают на один адрес в памяти (runtime.zerobase).

Подробнее →
14 Какая структура занимает больше памяти? 🔴 Сложный
Ответ: A) struct{a bool; b int64; c bool}

Компилятор добавляет padding для выравнивания полей. Первый вариант: bool(1) + 7 padding + int64(8) + bool(1) + 7 padding = 24 байта. Второй: int64(8) + bool(1) + bool(1) + 6 padding = 16 байт. Порядок полей влияет на размер структуры.

Подробнее →
15 Почему порядок полей в структуре может влиять на её размер в памяти? 🔴 Сложный
Ответ: B) Из-за выравнивания (alignment) - padding между полями

CPU требует выравнивание данных по границам (int64 по 8 байт). Между полями добавляется padding. struct{bool; int64; bool} = 24 байта (1+7pad+8+1+7pad). struct{int64; bool; bool} = 16 байт (8+1+1+6pad). fieldalignment линтер находит неоптимальные структуры.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.