Вопрос на собеседовании · Go-разработчик
Когда nil-интерфейс не равен nil?
Короткий ответ, ключевые тезисы и ошибки, которых стоит избежать на интервью.
Значение интерфейса в Go содержит динамический тип и динамическое значение. Интерфейс равен nil только когда обе части отсутствуют. Если в интерфейс положить nil-указатель конкретного типа, динамический тип останется, поэтому сам интерфейс уже не равен nil.
Особенно опасен этот случай при возврате error: функция может вернуть указатель на собственный тип ошибки, равный nil, но после преобразования к error вызывающий код увидит ненулевой интерфейс.
01 · Структура ответа
Что важно сказать интервьюеру
Начните с определения, затем объясните механизм и закончите примером из практики. Для полного ответа раскройте эти тезисы:
02 · Пример
Как объяснить на практике
Переменная var customErr *MyError равна nil. После присваивания var err error = customErr выражение err != nil истинно, потому что интерфейс хранит тип *MyError, хотя его динамическое значение — nil.
Не заучивайте формулировку дословно. Свяжите принцип с задачей из собственного проекта — интервьюер почти наверняка попросит уточнить детали реализации и компромиссы.
03 · Ошибки
Чего избегать в ответе
04 · Углубление
Что могут спросить следом
- Из чего состоит значение интерфейса?
- Как typed nil попадает в error?
- Как безопасно вернуть пользовательскую ошибку?
Практика ответа
Ответьте вслух, а не про себя
Откроем тренировку сразу на этом вопросе. Выберите грейд, сформулируйте ответ и сравните его с опорой.
Mira