Будет напечатано panic: not found, но настоящая panic не вызывается. Равенство с errors.New(errMsg) ложно из-за разных динамических типов ошибок.
Какой вывод получит программа в консоли (вариант 6)
Будет напечатано panic: not found, но настоящая panic не вызывается. Равенство с errors.New(errMsg) ложно из-за разных динамических типов ошибок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет текст, напечатанный в консоли после запуска следующей программы
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
}
}
Ответ
Будет напечатано panic: not found, но настоящая panic не вызывается. Равенство с errors.New(errMsg) ложно из-за разных динамических типов ошибок.
someFunc возвращает значение типа myErr, а errors.New создаёт другую реализацию error. Совпадающий текст не означает равенство ошибок.
Вторая ветка с err != nil выполняется и просто печатает слово panic как обычный текст. Для устойчивой проверки используйте заранее объявленную sentinel-ошибку с errors.Is или собственный тип с errors.As. Создавать новую ошибку на месте сравнения и ожидать совпадения по сообщению — неверная стратегия.