diff options
| author | dmathieu <42@dmathieu.com> | 2024-12-11 09:55:27 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-04-14 06:49:08 -0700 |
| commit | 80bff42fdd0380c09f4df35c4baacb9cfdae5aae (patch) | |
| tree | dd9d1f833f3a4c7b64fb8e58bbf45fe69c37994b /src | |
| parent | 0c0d2572414d4d32feca74d902a761ff25457af9 (diff) | |
| download | go-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.go | 12 | ||||
| -rw-r--r-- | src/errors/join_test.go | 34 |
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...) + } + }) + } +} |
