Основы синтаксиса Строки и руны Массивы и слайсы Map Структуры и методы Интерфейсы Горутины и конкурентность Каналы defer, panic, recover Обработка ошибок Указатели Пакет sync Тестирование Пакеты и модули Стандартная библиотека Context Generics iota и перечисления Разное / продвинутое

Интерфейсы

8 вопросов

Интерфейсы в Go реализуются неявно (duck typing). Пустой интерфейс interface{} (any), type assertion, type switch и тонкости с nil-интерфейсами - частые темы собеседований.

1 Что такое интерфейс в Go? 🟢 Лёгкий
Ответ: B) Набор методов, которые тип должен реализовать

Интерфейс определяет контракт - набор методов. Любой тип, который имеет все эти методы, автоматически реализует интерфейс. Нет абстрактных классов - интерфейсы полностью заменяют их в Go.

Подробнее →
2 Нужно ли явно указывать, что тип реализует интерфейс? 🟢 Лёгкий
Ответ: B) Нет, реализация неявная

Go использует структурную типизацию (duck typing): если тип имеет все методы интерфейса, он его реализует. Не нужно писать implements. Тип может реализовать интерфейс из другого пакета, не зная о нём.

Подробнее →
3 Что такое пустой интерфейс interface{}? 🟢 Лёгкий
Ответ: A) Интерфейс без методов, принимает любой тип

interface{} (или any с Go 1.18) не содержит методов, поэтому любой тип его реализует. Используется для хранения значений произвольного типа. Для извлечения конкретного типа нужен type assertion.

Подробнее →
4 Что делает type assertion x.(int)? 🟡 Средний
Ответ: B) Извлекает значение типа int из интерфейса

Type assertion проверяет, что интерфейсная переменная содержит значение конкретного типа, и извлекает его. v := x.(int) - если x не содержит int, будет panic. Безопасная форма: v, ok := x.(int).

Подробнее →
5 Что произойдёт при неудачном type assertion без ok? 🟢 Лёгкий
Ответ: B) panic

Однозначный type assertion x.(int) вызывает panic, если тип не совпадает. Безопасная форма v, ok := x.(int) возвращает ok = false и zero value, без паники.

Подробнее →
6 Что такое any в Go 1.18+? 🟢 Лёгкий
Ответ: B) Алиас для interface{}

any - встроенный алиас для interface{}, введённый в Go 1.18 для краткости. func Print(v any) читается лучше, чем func Print(v interface{}). Функционально они идентичны.

Подробнее →
7 Когда интерфейсная переменная равна nil? 🔴 Сложный
Ответ: B) Когда и тип, и значение nil

Интерфейс хранит пару (тип, значение). Он nil только когда оба компонента nil. Частая ловушка: var p *MyStruct = nil; var i interface{} = p; i != nil - true! Потому что тип (*MyStruct) не nil.

Подробнее →
8 Что такое type switch? 🟡 Средний
Ответ: B) switch по типу интерфейсной переменной

Type switch позволяет выполнять разный код в зависимости от конкретного типа значения в интерфейсе: switch v := x.(type) { case int: ... case string: ... }. Удобнее цепочки type assertions.

Подробнее →