Результат сравнения nil в Go

Будут выведены true, true, false: nil-указатель после присваивания интерфейсу сохраняет свой тип, и интерфейс уже не равен nil.

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

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

Будут выведены 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 с проверкой типа.

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

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

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

Подробнее