Какой вывод получит программа в консоли (вариант 6)

Будет напечатано panic: not found, но настоящая panic не вызывается. Равенство с errors.New(errMsg) ложно из-за разных динамических типов ошибок.

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

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

Будет напечатано 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. Создавать новую ошибку на месте сравнения и ожидать совпадения по сообщению — неверная стратегия.

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

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

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

Подробнее