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 tree consists of err itself, followed by the errors obtained by repeatedly// calling Unwrap. 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 {return ==}:= reflectlite.TypeOf().Comparable()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.//// The tree consists of err itself, followed by the errors obtained by repeatedly// calling Unwrap. 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(interface{}) 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")}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 (, ) {return true}}return falsedefault:return false}}}var errorType = reflectlite.TypeOf((*error)(nil)).Elem()
![]() |
The pages are generated with Golds v0.6.7. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |