Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go1.23で入った errorsパッケージの小さなアプデ

kuro
September 13, 2024

Go1.23で入った errorsパッケージの小さなアプデ

Asakusa.go#3のLTのスライドです。

参考リンク
576015: errors: return early for Is(nil, ...)
https://go-review.googlesource.com/c/go/+/576015

Go errors.Is now includes a nil check. | by the korean guy | Jul, 2024 | Medium
https://thekoreanguy.medium.com/go-errors-is-now-includes-a-nil-check-94f82fe4cc31

Sentinel errors and errors.Is() slow your code down by 500% | DoltHub Blog
https://www.dolthub.com/blog/2024-05-31-benchmarking-go-error-handling/

kuro

September 13, 2024
Tweet

More Decks by kuro

Other Decks in Programming

Transcript

  1. ③Go1.22までのerros.Is() Is()で、 まず、targetがnilかどうかをチェック。 targetが比較可能かどうかをチェック。 メインの処理ループ ↓ is()で • errとtargetが直接等しいかチェック。 •

    errがIs()メソッドを持っているかチェックし、持っている場合はそれを使用して比較。 • errがUnwrap()メソッドを持っているかチェック ◦ 単一のerrorを返すUnwrap()の場合、エラーをアンラップして再度比較。 ◦ []errorを返すUnwrap()の場合、各エラーに対して再帰的にチェック。 いずれの条件にも当てはまらない場合、 falseを返す。
  2. ベンチマークテストしてみた 1. err == nil かつ target == nilの場合 2.

    err == nil かつ target != nilの場合 3. err != nil かつ target == nilの場合 4. err != nil かつ target != nilの場合
  3. ベンチマークテストしてみた Go1.22の場合 goos: linux goarch: arm64 pkg: test BenchmarkErrorsIs/NilErrNilTarget-10 436627332

    2.651 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NilErrNonNilTarget-10 265319530 4.539 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NonNilErrNilTarget-10 564950251 2.116 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NonNilErrNonNilTarget-10 229817898 5.205 ns/op 0 B/op 0 allocs/op PASS ok test 6.242s Go1.23の場合 goos: linux goarch: arm64 pkg: test BenchmarkErrorsIs/NilErrNilTarget-10 467463865 2.556 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NilErrNonNilTarget-10 574588465 2.130 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NonNilErrNilTarget-10 569531488 2.136 ns/op 0 B/op 0 allocs/op BenchmarkErrorsIs/NonNilErrNonNilTarget-10 209177912 5.658 ns/op 0 B/op 0 allocs/op PASS ok test 6.093s
  4. 参考 - 576015: errors: return early for Is(nil, ...) -

    Go errors.Is now includes a nil check. | by the korean guy | Jul, 2024 | Medium - Sentinel errors and errors.Is() slow your code down by 500% | DoltHub Blog