Skip to content

Commit 80bff42

Browse files
dmathieugopherbot
authored andcommitted
errors: optimize errors.Join for single unwrappable errors
Change-Id: I10bbb782ca7234cda8c82353f2255eec5be588c9 GitHub-Last-Rev: e5ad8fd GitHub-Pull-Request: #70770 Reviewed-on: https://go-review.googlesource.com/c/go/+/635115 Auto-Submit: Sean Liao <[email protected]> Reviewed-by: Michael Pratt <[email protected]> Reviewed-by: Sean Liao <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 0c0d257 commit 80bff42

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/errors/join.go

+12
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ func Join(errs ...error) error {
2626
if n == 0 {
2727
return nil
2828
}
29+
if n == 1 {
30+
for _, err := range errs {
31+
if err != nil {
32+
if _, ok := err.(interface {
33+
Unwrap() []error
34+
}); ok {
35+
return err
36+
}
37+
}
38+
}
39+
}
40+
2941
e := &joinError{
3042
errs: make([]error, 0, n),
3143
}

src/errors/join_test.go

+34
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,37 @@ func TestJoinErrorMethod(t *testing.T) {
7070
}
7171
}
7272
}
73+
74+
func BenchmarkJoin(b *testing.B) {
75+
for _, bb := range []struct {
76+
name string
77+
errs []error
78+
}{
79+
{
80+
name: "no error",
81+
},
82+
{
83+
name: "single non-nil error",
84+
errs: []error{errors.New("err")},
85+
},
86+
{
87+
name: "multiple errors",
88+
errs: []error{errors.New("err"), errors.New("newerr"), errors.New("newerr2")},
89+
},
90+
{
91+
name: "unwrappable single error",
92+
errs: []error{errors.Join(errors.New("err"))},
93+
},
94+
{
95+
name: "nil first error",
96+
errs: []error{nil, errors.New("newerr")},
97+
},
98+
} {
99+
b.Run(bb.name, func(b *testing.B) {
100+
b.ReportAllocs()
101+
for i := 0; i < b.N; i++ {
102+
_ = errors.Join(bb.errs...)
103+
}
104+
})
105+
}
106+
}

0 commit comments

Comments
 (0)