aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordmathieu <42@dmathieu.com>2024-12-11 09:55:27 +0000
committerGopher Robot <gobot@golang.org>2025-04-14 06:49:08 -0700
commit80bff42fdd0380c09f4df35c4baacb9cfdae5aae (patch)
treedd9d1f833f3a4c7b64fb8e58bbf45fe69c37994b /src
parent0c0d2572414d4d32feca74d902a761ff25457af9 (diff)
downloadgo-80bff42fdd0380c09f4df35c4baacb9cfdae5aae.tar.xz
errors: optimize errors.Join for single unwrappable errors
Change-Id: I10bbb782ca7234cda8c82353f2255eec5be588c9 GitHub-Last-Rev: e5ad8fdb802e56bb36c41b4982ed27c1e0809af8 GitHub-Pull-Request: golang/go#70770 Reviewed-on: https://go-review.googlesource.com/c/go/+/635115 Auto-Submit: Sean Liao <sean@liao.dev> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Sean Liao <sean@liao.dev> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src')
-rw-r--r--src/errors/join.go12
-rw-r--r--src/errors/join_test.go34
2 files changed, 46 insertions, 0 deletions
diff --git a/src/errors/join.go b/src/errors/join.go
index 349fc06ed9..dd50089c29 100644
--- a/src/errors/join.go
+++ b/src/errors/join.go
@@ -26,6 +26,18 @@ func Join(errs ...error) error {
if n == 0 {
return nil
}
+ if n == 1 {
+ for _, err := range errs {
+ if err != nil {
+ if _, ok := err.(interface {
+ Unwrap() []error
+ }); ok {
+ return err
+ }
+ }
+ }
+ }
+
e := &joinError{
errs: make([]error, 0, n),
}
diff --git a/src/errors/join_test.go b/src/errors/join_test.go
index 4828dc4d75..439b372ca0 100644
--- a/src/errors/join_test.go
+++ b/src/errors/join_test.go
@@ -70,3 +70,37 @@ func TestJoinErrorMethod(t *testing.T) {
}
}
}
+
+func BenchmarkJoin(b *testing.B) {
+ for _, bb := range []struct {
+ name string
+ errs []error
+ }{
+ {
+ name: "no error",
+ },
+ {
+ name: "single non-nil error",
+ errs: []error{errors.New("err")},
+ },
+ {
+ name: "multiple errors",
+ errs: []error{errors.New("err"), errors.New("newerr"), errors.New("newerr2")},
+ },
+ {
+ name: "unwrappable single error",
+ errs: []error{errors.Join(errors.New("err"))},
+ },
+ {
+ name: "nil first error",
+ errs: []error{nil, errors.New("newerr")},
+ },
+ } {
+ b.Run(bb.name, func(b *testing.B) {
+ b.ReportAllocs()
+ for i := 0; i < b.N; i++ {
+ _ = errors.Join(bb.errs...)
+ }
+ })
+ }
+}