Что выведет код Middle Ошибки, defer, panic и recover обновлено
Что выведет Go: errors.Is и errors.As по цепочке
Вопрос
Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.
package main
import (
"errors"
"fmt"
)
type CodeErr struct{ Code int }
func (e *CodeErr) Error() string { return fmt.Sprintf("code %d", e.Code) }
var ErrBase = errors.New("base")
func main() {
e1 := fmt.Errorf("db: %w", &CodeErr{Code: 404})
e2 := fmt.Errorf("svc: %w", e1)
e3 := fmt.Errorf("svc: %v", e1)
var ce *CodeErr
fmt.Println(errors.As(e2, &ce), ce.Code)
fmt.Println(errors.As(e3, &ce), e2)
fmt.Println(errors.Is(errors.Join(e2, ErrBase), ErrBase))
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: true 404, false svc: db: code 404, true. errors.As проходит цепочку e2 → e1 → CodeErr и заполняет ce. e3 создан через %v, цепочка оборвана, As возвращает false (ce остаётся прежним).
Что выведет
true 404
false svc: db: code 404
true
Разбор
errors.As проходит цепочку e2 → e1 → *CodeErr и заполняет ce. e3 создан через %v, цепочка оборвана, As возвращает false (ce остаётся прежним). Текст e2 собран из всех слоёв. errors.Join оборачивает обе ошибки, и Is находит ErrBase.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Go: порядок defer и вычисление аргументов
Следующий вопрос
Что выведет Go: defer и именованные результаты