// 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 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.//// 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()
The pages are generated with Goldsv0.7.0-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.