Задачи на интерфесы
1) Что выведет данная программа и почему?
Программа выведет следующее:
Давайте разберемся, почему это происходит:
В программе определен тип ошибки
myErr
, который реализует интерфейсerror
через методError()
, возвращающий строку сообщения об ошибке.Функция
someFunc()
возвращает новый экземплярmyErr
с сообщениемerrMsg
, которое равно "not found".В функции
main()
вызываетсяsomeFunc()
, и результат (ошибка) сохраняется в переменнойerr
.Далее следует конструкция
switch
без выражения, что означает, что каждыйcase
будет проверяться на истинность в порядке их написания:Первый
case
проверяет, равна ли ошибкаerr
результату вызоваerrors.New(errMsg)
. Функцияerrors.New
создает новый объект ошибки с новым адресом в памяти. Поскольку в Go сравнение ошибок происходит по идентичности (то есть по адресу в памяти), а не по содержимому,err == errors.New(errMsg)
вернетfalse
.Второй
case
проверяет, не равна ли ошибкаnil
. Посколькуerr
содержит ошибкуmyErr
, это условие истинно, и выполняется код внутри этогоcase
, выводящий "panic:" и сообщение ошибки, которое равно "not found".
Таким образом, программа выводит "panic: not found", потому что ошибка err
не равна nil
и не равна новому экземпляру ошибки, созданному с тем же сообщением, но по другому адресу в памяти.
Last updated