Задачи на интерфесы
1) Что выведет данная программа и почему?
package main
import (
"errors"
"fmt"
)
const errMsg = "not found"
type myErr struct {
msg string
}
func (e myErr) Error() string {
return e.msg
}
func someFunc() error {
return myErr{errMsg}
}
func main() {
err := someFunc()
switch {
case err == errors.New(errMsg):
fmt.Println("OK, next")
case err != nil:
fmt.Println("panic:", err.Error())
default: // err == nil
fmt.Println("OK, work with it")
}
}Программа выведет следующее:
panic: not foundДавайте разберемся, почему это происходит:
В программе определен тип ошибки
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