Сравнение значений интерфейсов в Go

Результат сравнения — false. NewRepo1 возвращает интерфейс с динамическим типом *InMemoryRepo и nil-значением, а NewRepo2 — действительно nil-интерфейс.

Короткий ответ

Что ответить на собеседовании

Результат сравнения — false. NewRepo1 возвращает интерфейс с динамическим типом *InMemoryRepo и nil-значением, а NewRepo2 — действительно nil-интерфейс.

Подробный разбор

Ответ с пояснениями

Условие

Вопрос: какой результат выведет программа, если сравнить результаты вызовов функций NewRepo1() и NewRepo2() оператором ==? Рассмотрим следующий пример кода:

type InMemoryRepo struct {
  Value string
}

type Repository interface{}

func NewRepo1() Repository {
  var e *InMemoryRepo
  return e
}

func NewRepo2() Repository {
  return nil
}

func main() {
  fmt.Println(NewRepo1() == NewRepo2())
}

Ответ

Результат сравнения — false. NewRepo1 возвращает интерфейс с динамическим типом *InMemoryRepo и nil-значением, а NewRepo2 — действительно nil-интерфейс.

Интерфейс равен nil только при отсутствии и динамического типа, и значения. Поэтому typed nil внутри него отличается от простого nil. В этом примере сравнение безопасно: указательный динамический тип сравним. Для интерфейсов с map или slice сравнение с другим таким значением могло бы вызвать panic.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее