Результат сравнения — false. NewRepo1 возвращает интерфейс с динамическим типом *InMemoryRepo и nil-значением, а NewRepo2 — действительно nil-интерфейс.
Сравнение значений интерфейсов в Go
Результат сравнения — 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.