Source File
wrap.go
Belonging Package
errors
// Copyright 2018 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package errorsimport ()// Unwrap returns the result of calling the Unwrap method on err, if err's// type contains an Unwrap method returning error.// Otherwise, Unwrap returns nil.//// Unwrap only calls a method of the form "Unwrap() error".// In particular Unwrap does not unwrap errors returned by [Join].func ( error) error {, := .(interface {() error})if ! {return nil}return .()}// Is reports whether any error in err's tree matches target.// The target must be comparable.//// The tree consists of err itself, followed by the errors obtained by repeatedly// calling its Unwrap() error or Unwrap() []error method. When err wraps multiple// errors, Is examines err followed by a depth-first traversal of its children.//// An error is considered to match a target if it is equal to that target or if// it implements a method Is(error) bool such that Is(target) returns true.//// An error type might provide an Is method so it can be treated as equivalent// to an existing error. For example, if MyError defines//// func (m MyError) Is(target error) bool { return target == fs.ErrExist }//// then Is(MyError{}, fs.ErrExist) returns true. See [syscall.Errno.Is] for// an example in the standard library. An Is method should only shallowly// compare err and the target and not call [Unwrap] on either.func (, error) bool {if == nil || == nil {return ==}:= reflectlite.TypeOf().Comparable()return is(, , )}func (, error, bool) bool {for {if && == {return true}if , := .(interface{ (error) bool }); && .() {return true}switch x := .(type) {case interface{ () error }:= .()if == nil {return false}case interface{ () []error }:for , := range .() {if (, , ) {return true}}return falsedefault:return false}}}// As finds the first error in err's tree that matches target, and if one is found, sets// target to that error value and returns true. Otherwise, it returns false.//// For most uses, prefer [AsType]. As is equivalent to [AsType] but sets its target// argument rather than returning the matching error and doesn't require its target// argument to implement error.//// The tree consists of err itself, followed by the errors obtained by repeatedly// calling its Unwrap() error or Unwrap() []error method. When err wraps multiple// errors, As examines err followed by a depth-first traversal of its children.//// An error matches target if the error's concrete value is assignable to the value// pointed to by target, or if the error has a method As(any) bool such that// As(target) returns true. In the latter case, the As method is responsible for// setting target.//// An error type might provide an As method so it can be treated as if it were a// different error type.//// As panics if target is not a non-nil pointer to either a type that implements// error, or to any interface type.func ( error, any) bool {if == nil {return false}if == nil {panic("errors: target cannot be nil")}:= reflectlite.ValueOf():= .Type()if .Kind() != reflectlite.Ptr || .IsNil() {panic("errors: target must be a non-nil pointer")}:= .Elem()if .Kind() != reflectlite.Interface && !.Implements(errorType) {panic("errors: *target must be interface or implement error")}return as(, , , )}func ( error, any, reflectlite.Value, reflectlite.Type) bool {for {if reflectlite.TypeOf().AssignableTo() {.Elem().Set(reflectlite.ValueOf())return true}if , := .(interface{ (any) bool }); && .() {return true}switch x := .(type) {case interface{ () error }:= .()if == nil {return false}case interface{ () []error }:for , := range .() {if == nil {continue}if (, , , ) {return true}}return falsedefault:return false}}}var errorType = reflectlite.TypeOf((*error)(nil)).Elem()// AsType finds the first error in err's tree that matches the type E, and// if one is found, returns that error value and true. Otherwise, it// returns the zero value of E and false.//// The tree consists of err itself, followed by the errors obtained by// repeatedly calling its Unwrap() error or Unwrap() []error method. When// err wraps multiple errors, AsType examines err followed by a// depth-first traversal of its children.//// An error err matches the type E if the type assertion err.(E) holds,// or if the error has a method As(any) bool such that err.As(target)// returns true when target is a non-nil *E. In the latter case, the As// method is responsible for setting target.func [ error]( error) (, bool) {if == nil {varreturn , false}var * // lazily initializedreturn asType(, &)}func [ error]( error, **) ( , bool) {for {if , := .(); {return , true}if , := .(interface{ (any) bool }); {if * == nil {* = new()}if .(*) {return **, true}}switch x := .(type) {case interface{ () error }:= .()if == nil {return}case interface{ () []error }:for , := range .() {if == nil {continue}if , := (, ); {return , true}}returndefault:return}}}
The pages are generated with Golds v0.8.4. (GOOS=linux GOARCH=amd64)