🧩 Go: как работает errors.As с указателями и значениями
Ниже — мини-пример, который показывает, почему иногда нужно передавать
Код:
Ожидаемый вывод:
Ключевая идея:
🟢 Если в err лежит значение типа E, то для совпадения target должен быть *E (элемент указателя — E).
🟢 Если в err лежит *E, то для совпадения target должен быть **E (элемент указателя — *E).
🟢 Шаблон «поймать конкретный тип ошибки-пойнтер» обычно выглядит так:
var te *T; if errors.As(err, &te) { ... } — именно двойной указатель в target.
Ниже — мини-пример, который показывает, почему иногда нужно передавать
&ptr
, а иногда — сам ptr
. Главное правило: errors.As(err, target)
принимает указатель на тип (или интерфейс), и сопоставление происходит по типу элемента этого указателя.Код:
package main
import "errors"
type E struct{}
func (E) Error() string { return "" }
func main() {
e := &E{}
println(
errors.As(*e, &e), // err: E, target: **E -> ищем *E в цепочке, но у нас E
errors.As(*e, e), // err: E, target: *E -> элемент target = E, совпало
errors.As(e, e), // err: *E, target: *E -> элемент target = E, не совпало
errors.As(e, &e), // err: *E, target: **E -> элемент target = *E, совпало
)
}
Ожидаемый вывод:
false true false true
Ключевая идея:
var te *T; if errors.As(err, &te) { ... } — именно двойной указатель в target.
Please open Telegram to view this post
VIEW IN TELEGRAM