Вопрос проверяет понимание внутреннего устройства интерфейсов в Go.
Интерфейс в Go состоит из типа и значения. Если в интерфейс записан typed nil, тип присутствует, но значение равно nil. Такой интерфейс не равен nil, потому что тип внутри него задан. Поэтому сравнение с nil возвращает false.
Интерфейс в Go состоит из двух частей:
Определение:
Интерфейс хранит динамический тип и динамическое значение.
var p *int = nil
var i interface{} = p
fmt.Println(i == nil) // false
Почему:
Тип внутри интерфейса — *int.
Значение — nil.
Интерфейс не пуст, потому что тип установлен.
Логически он содержит:
Type pointer
Data pointer
Если Type не nil — интерфейс считается не nil.
Если важно проверить значение:
if i == nil {
// интерфейс пуст
}
Если нужно проверить содержимое:
Использовать type assertion.
Проверять результат приведения.
if v, ok := i.(*int); ok && v == nil {
// typed nil
}
Частые случаи:
Ошибки (error interface).
Возврат nil-указателей через интерфейс.
DI и фабрики.
Интерфейс равен nil только если и тип, и значение равны nil. Typed nil создает ситуацию, когда интерфейс визуально содержит nil, но не считается nil.