Сравнение возвращаемых ошибок с nil

По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.

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

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

По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.

Подробный разбор

Ответ с пояснениями

Условие

Исследуйте, как функции, возвращающие различные типы ошибок, сравниваются с nil, и предскажите, какие значения будут напечатаны в консоли.

package main

import (
  "fmt"
)

type MyErr struct{}

func (me MyErr) Error() string {
  return "my err string"
}

func main() {
  fmt.Println(returnError() == nil)
  fmt.Println(returnErrorPtr() == nil)

  fmt.Println(returnCustomError() == nil)
  fmt.Println(returnCustomErrorPtr() == nil)

  fmt.Println(returnMyError() == nil)
}

func returnError() error {
  var err error
  return err
}

func returnErrorPtr() *error {
  var err *error
  return err
}

func returnCustomError() error {
  var customErr MyErr
  return customErr
}

func returnCustomErrorPtr() error {
  var customErr *MyErr
  return customErr
}

func returnMyError() *MyErr {
  return nil
}

``

Ответ

По порядку будут выведены true, true, false, false, true. Различайте nil-интерфейс, типизированный nil внутри него и обычный nil-указатель.

returnError возвращает пустой error, а returnErrorPtr — nil-указатель на интерфейс: оба равны nil. returnCustomError упаковывает значение MyErr в интерфейс, поэтому результат не nil.

returnCustomErrorPtr возвращает error с типом *MyErr и nil-значением — тоже не nil. Последняя функция возвращает сам *MyErr без упаковки, и её nil непосредственно равен nil. Методы Error здесь не вызываются; сравнение не разыменовывает указатели.

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

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

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

Подробнее