Введение в свои ошибки в Go
Ошибка в Go может быть не только готовой
строкой из пакета errors или текста из
fmt.Errorf. «Своя ошибка хранит не только
текст, но и поля, которые потом можно достать
по типу. Так в одном значении держат путь к
файлу, код операции или исходную причину, а
наружу все равно отдают короткое сообщение.
Текст для печати собирают из полей в методе,
который возвращает строку. Снаружи такое
значение ведут как обычную ошибку: проверяют
на nil, передают дальше, выводят при
неудаче. Отличие в том, что вызывающий код
при необходимости может узнать конкретный тип
и прочитать сохраненные данные.
Связь с интерфейсами здесь прямая: встроенный
тип error требует один метод с результатом
string. Любая структура с таким методом
подходит под этот интерфейс без отдельной
записи в коде. Вы уже видели неявное соответствие
для своих интерфейсов; для ошибки правило то же.
В этом разделе разберем метод текста для своего
типа, возврат такого значения из функции,
обертку внешнего сообщения через %w
и доставание конкретного типа из цепочки.
Сначала научимся описывать структуру с полями,
затем увидим, как по типу достают путь и
внутреннюю причину, даже если ошибку обернули
дополнительным текстом.