Выбор ответа Middle Структуры, методы и интерфейсы спрашивают часто обновлено

Интерфейс с nil-указателем не равен nil

Вопрос

Что выведет код?

type MyErr struct{}

func (*MyErr) Error() string { return "err" }

func get() error {
    var p *MyErr
    return p
}

func main() {
    fmt.Println(get() == nil)
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: false. Значение интерфейса это пара (динамический тип, указатель на данные). get возвращает интерфейс error с типом MyErr и nil-указателем внутри.

Варианты ответа

  1. true
  2. falseправильный ответ
  3. panic: nil pointer dereference
  4. Ошибка компиляции

Разбор

Значение интерфейса это пара (динамический тип, указатель на данные). get возвращает интерфейс error с типом *MyErr и nil-указателем внутри. Интерфейс равен nil, только когда пусты обе части, поэтому сравнение даёт false. Паники нет: никто не разыменовывает указатель. Исправление: в успешном случае возвращать литерал nil.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.