Какой будет вывод функции checkErr в main

Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.

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

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

Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.

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

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

Условие

Какие булевые значения напечатает функция checkErr при разных вызовах из main.

import (
  "fmt"
)

type errorString struct {
  s string
}

func (e errorString) Error() string {
  return e.s
}

func checkErr(err error) {
  fmt.Println(err == nil)
}

func main() {
  var err1 error
  checkErr(err1)

  var errPtr *errorString
  checkErr(errPtr)

  errPtr = &errorString{}
  checkErr(errPtr)

  errPtr = nil
  checkErr(errPtr)
}

Ответ

Вывод: true, false, false, false — по одному значению на строке. Только err1 является действительно nil-интерфейсом.

При передаче errPtr в checkErr интерфейс получает динамический тип *errorString, даже если значение указателя nil. После повторного присваивания nil указателю этот тип при следующей упаковке не исчезает. Метод Error здесь не вызывается, поэтому nil-указатель не разыменовывается. Nil-интерфейс не содержит ни динамического типа, ни значения.

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

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

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

Подробнее