Будут выведены true, true, false: nil-указатель после присваивания интерфейсу сохраняет свой тип, и интерфейс уже не равен nil.
Результат сравнения nil в Go
Будут выведены true, true, false: nil-указатель после присваивания интерфейсу сохраняет свой тип, и интерфейс уже не равен nil.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Рассмотрим, как в Go происходит сравнение значений с nil для указателей и пустых интерфейсов.
var s *string
fmt.Println(s == nil)
var i interface{}
fmt.Println(i == nil)
i = s
fmt.Println(i == nil)
Ответ
Будут выведены true, true, false: nil-указатель после присваивания интерфейсу сохраняет свой тип, и интерфейс уже не равен nil.
s — указатель на string с нулевым значением nil. Пустой i до присваивания тоже nil, поскольку в нём нет ни динамического типа, ни данных.
После i = s интерфейс содержит пару (*string, nil). Проверка i == nil не разыменовывает s и не сравнивает только значение указателя. Если необходимо проверить указатель, сравнивайте s непосредственно либо извлеките его через type assertion с проверкой типа.