8 вопросов
Интерфейсы в Go реализуются неявно (duck typing). Пустой интерфейс interface{} (any), type assertion, type switch и тонкости с nil-интерфейсами - частые темы собеседований.
Интерфейс определяет контракт - набор методов. Любой тип, который имеет все эти методы, автоматически реализует интерфейс. Нет абстрактных классов - интерфейсы полностью заменяют их в Go.
Подробнее →Go использует структурную типизацию (duck typing): если тип имеет все методы интерфейса, он его реализует. Не нужно писать implements. Тип может реализовать интерфейс из другого пакета, не зная о нём.
Подробнее →interface{}? 🟢 Лёгкий
▶
interface{} (или any с Go 1.18) не содержит методов, поэтому любой тип его реализует. Используется для хранения значений произвольного типа. Для извлечения конкретного типа нужен type assertion.
Подробнее →x.(int)? 🟡 Средний
▶
Type assertion проверяет, что интерфейсная переменная содержит значение конкретного типа, и извлекает его. v := x.(int) - если x не содержит int, будет panic. Безопасная форма: v, ok := x.(int).
Подробнее →ok? 🟢 Лёгкий
▶
Однозначный type assertion x.(int) вызывает panic, если тип не совпадает. Безопасная форма v, ok := x.(int) возвращает ok = false и zero value, без паники.
Подробнее →any в Go 1.18+? 🟢 Лёгкий
▶
any - встроенный алиас для interface{}, введённый в Go 1.18 для краткости. func Print(v any) читается лучше, чем func Print(v interface{}). Функционально они идентичны.
Подробнее →Интерфейс хранит пару (тип, значение). Он nil только когда оба компонента nil. Частая ловушка: var p *MyStruct = nil; var i interface{} = p; i != nil - true! Потому что тип (*MyStruct) не nil.
Подробнее →Type switch позволяет выполнять разный код в зависимости от конкретного типа значения в интерфейсе: switch v := x.(type) { case int: ... case string: ... }. Удобнее цепочки type assertions.
Подробнее →