]> Cypherpunks repositories - gostls13.git/commitdiff
errors: mention Is methods should not call Unwrap
authorMatt T. Proud <matt.proud@gmail.com>
Tue, 19 Oct 2021 08:09:06 +0000 (10:09 +0200)
committerDamien Neil <dneil@google.com>
Tue, 19 Oct 2021 18:42:57 +0000 (18:42 +0000)
errors.Is internally unwraps the error until the error matches the
target. Because of this, a user-authored Is method on an error type
need not call errors.Unwrap on itself or the target, because that would
make the unwrapping operation O(N^2). It is a subtle detail to remind
authors for resource efficiency reasons.

Change-Id: Ic1ba59a5bdbfe2c7cb51a2cba2537ab6de4a13ff
Reviewed-on: https://go-review.googlesource.com/c/go/+/356789
Reviewed-by: Jean de Klerk <deklerk@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
Trust: Jean de Klerk <deklerk@google.com>
Trust: Damien Neil <dneil@google.com>
Run-TryBot: Jean de Klerk <deklerk@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/errors/wrap.go

index 4eb4f9ae378bdbb182d4403edfd725cebbd6dfa6..b73d5a8ce29f3ff7902f2f356d9d4f3108db785a 100644 (file)
@@ -35,7 +35,8 @@ func Unwrap(err error) error {
 //     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 example in the standard library. An Is method should only shallowly
+// compare err and the target and not call Unwrap on either.
 func Is(err, target error) bool {
        if target == nil {
                return err == target