Что выведет код 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 ошибок.

Термины по теме