Задачи на интерфесы
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