// 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 ! {returnnil }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()returnis(, , )}func is(, error, bool) bool {for {if && == {returntrue }if , := .(interface{ (error) bool }); && .() {returntrue }switch x := .(type) {caseinterface{ () error }: = .()if == nil {returnfalse }caseinterface{ () []error }:for , := range .() {if (, , ) {returntrue } }returnfalsedefault:returnfalse } }}// 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 {returnfalse }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") }returnas(, , , )}func as( error, any, reflectlite.Value, reflectlite.Type) bool {for {ifreflectlite.TypeOf().AssignableTo() { .Elem().Set(reflectlite.ValueOf())returntrue }if , := .(interface{ (any) bool }); && .() {returntrue }switch x := .(type) {caseinterface{ () error }: = .()if == nil {returnfalse }caseinterface{ () []error }:for , := range .() {if == nil {continue }if (, , , ) {returntrue } }returnfalsedefault:returnfalse } }}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 initializedreturnasType(, &)}func asType[ error]( error, **) ( , bool) {for {if , := .(); {return , true }if , := .(interface{ (any) bool }); {if * == nil { * = new() }if .(*) {return **, true } }switch x := .(type) {caseinterface{ () error }: = .()if == nil {return }caseinterface{ () []error }:for , := range .() {if == nil {continue }if , := (, ); {return , true } }returndefault:return } }}
The pages are generated with Goldsv0.8.3-preview. (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 @zigo_101 (reachable from the left QR code) to get the latest news of Golds.