Slide 1

Slide 1 text

Go1.23で入った errorsパッケージの小さなアプデ Asakusa.go#3 2024/09/13 kuro

Slide 2

Slide 2 text

自己紹介 kuro @knkurokuro7 - 名前:kuroda naoki - 所属:株式会社サイバーエージェント AI事業本部 プリズムパートナーカンパニー - 浅草は仲がいい先輩が住んでいる という縁があります。

Slide 3

Slide 3 text

今回言いたいこと - Go1.23からerrors.Is()にちょっとした変更が入りました! 576015: errors: return early for Is(nil, ...) https://go-review.googlesource.com/c/go/+/576015

Slide 4

Slide 4 text

①Go1.22までのerros.Is()

Slide 5

Slide 5 text

②Go1.22までのerros.Is()

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

③Go1.22までのerros.Is() Is()で、 まず、targetがnilかどうかをチェック。 targetが比較可能かどうかをチェック。 メインの処理ループ ↓ is()で ● errとtargetが直接等しいかチェック。 ● errがIs()メソッドを持っているかチェックし、持っている場合はそれを使用して比較。 ● errがUnwrap()メソッドを持っているかチェック ○ 単一のerrorを返すUnwrap()の場合、エラーをアンラップして再度比較。 ○ []errorを返すUnwrap()の場合、各エラーに対して再帰的にチェック。 いずれの条件にも当てはまらない場合、 falseを返す。

Slide 8

Slide 8 text

Go1.23からのerrors.Is()

Slide 9

Slide 9 text

ベンチマークテストしてみた 1. err == nil かつ target == nilの場合 2. err == nil かつ target != nilの場合 3. err != nil かつ target == nilの場合 4. err != nil かつ target != nilの場合

Slide 10

Slide 10 text

ベンチマークテストしてみた 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

Slide 11

Slide 11 text

Go1.22までは... - errors.Is()の引数のerrが nilの場合、最後にfalseを 返すまでに時間がかか る。。 - そのため、if err != nilで チェックすることが多かっ た。

Slide 12

Slide 12 text

Go1.23からは... - errors.Is()の引数のerrが nilの場合、errors.Is()の早 めの段階でerrのnilチェッ クが入ったので、if err != nilのなかにネストしなくて もパフォーマンスはあまり 変わらない。

Slide 13

Slide 13 text

どっちがいい? 1. err != nilの内側で 2. err != nilの外側で

Slide 14

Slide 14 text

参考 - 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