Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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