Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
次なるpkg/errorsを探して
Search
Takayuki Miyahara
June 15, 2023
Programming
1.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
次なるpkg/errorsを探して
Takayuki Miyahara
June 15, 2023
More Decks by Takayuki Miyahara
See All by Takayuki Miyahara
ブログのリアクションから始めるGoのパフォーマンス分析入門
always_allokay
0
490
Other Decks in Programming
See All in Programming
GraphQL の onError と Nullability のこれから
quramy
0
210
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
170
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
240
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
160
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
2k
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
260
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.3k
SODA - FACT BOOK(EN)
sodainc
1
230
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
AmebaブログはKMPから卒業します
kmars0605
0
340
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
200
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6.4k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Balancing Empowerment & Direction
lara
6
1.4k
WENDY [Excerpt]
tessaabrams
15
40k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
630
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
840
Google's AI Overviews - The New Search
badams
0
1.7k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
3k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
350
Transcript
次なるpkg/errorsを探して 宮原 孝行 【Gophers Talk】LT & カンファレンス感想戦 2023/06/15
Copyright Kanmu, Inc. All right reserved. 2 宮原 孝行 software
engineer at Kanmu, Inc. @miyataka @always_allokay 自己紹介
Copyright Kanmu, Inc. All right reserved. 3 発表の目的 pkg/errors とはなにか
移行先に求めるもの 移行の選択肢 評価 1 2 3 目次 4 5
発表の目的 1
Copyright Kanmu, Inc. All right reserved. 発表の目的 5 1 pkg/errorsの移行先を探すための参考情報を提供すること
pkg/errors とはなにか 2
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 7 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 8 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットである
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 9 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットであるあった
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 10 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • なぜ移行したいのか? ◦ Go1.20でerrorsパッケージに1.13以来の変更が入り、Go本体との差分が 発生した ◦ 2021年12月にPublic Archiveとなり、メンテが行われなくなっている https://go.googlesource.com/proposal/+/master/design/go2draft.md https://go.dev/doc/go1.20
移行先に求めるもの 3
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 12 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ • スタックトレースのサポート • 性能が大きく劣化しないこと
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 13 3 •
移行のしやすさ ◦ 標準errors、pkg/errorsとの互換性 ▪ 関数、メソッドのシグニチャが一致しているか ▪ 機能をもれなくカバーしているか
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 14 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • スタックトレースのサポート ◦ どの処理から呼び出されたかなど、バグ解消に直結する情報を含むので 重要 ◦ pkg/errorsがカバーしていた範囲を引き継ぐ必要がある
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 15 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能が大きく劣化しないこと ◦ 速いは正義 ◦ メモリフットプリントは小さいほどよい
移行の選択肢 4
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 17 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ ◦ cockroachdb/errors ◦ goark/errs
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 18 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ◦ morikuni/failure ◦ 標準ライブラリを使った自前実装
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 19 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ▪ もともと、前回の標準errors改修タイミング(Go1.13リリース時)の橋渡 しとしての位置付け ▪ すでに大部分がdeprecatedである ◦ morikuni/failure ▪ エラーコードベースのハンドリングを前提 ◦ 標準ライブラリを使った自前実装 ▪ 自社固有の要件がない
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 20 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ(再掲) ◦ cockroachdb/errors ◦ goark/errs • 移行先に求めるもの(再掲) ◦ 移行のしやすさ ◦ スタックトレースのサポート ◦ 性能が大きく劣化しないこと
評価 5
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 22 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 https://github.com/cockroachdb/errors/issues/99
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 23 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 24 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 25 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: ベンチマーク 26 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能評価としてマイクロベンチマークをとる ◦ 標準errors, pkg/errors, cockroachdb/errors, goark/errsの4つを比較 ◦ 実行したベンチマーク ▪ ネストしたerror生成時の速度とフットプリント ▪ スタックトレース出力時の速度とフットプリント ※ベンチマークテストコードは以下のレポジトリ https://github.com/miyataka/benchmark_pkg_errors_alternatives
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ pkg/errors
(baseline) ▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8249 ns/op, 304 B/op, 3 allocs/op ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 12849 ns/op, 3716 B/op, 33 allocs/op 評価: ベンチマーク 27 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ cockroachdb/errors
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8640 ns/op, 416 B/op, 7 allocs/op • 速度約5%pt、メモリ使用量約37%pt悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 14867 ns/op, 17222 B/op, 22 allocs/op • 速度が約15%pt、メモリ使用量が約4.6倍に悪化 評価: ベンチマーク 28 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ goark/errs
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 7885 ns/op, 648 B/op, 7 allocs/op • 速度約4.5pt改善、メモリ使用量は約2倍に悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 1896 ns/op, 1401 B/op, 33 allocs/op • 速度が約6倍改善、メモリ使用量は63%pt改善 評価: ベンチマーク 29 5 ※ただし、マイクロベンチマークであり、実際の環境では異なる結果となる可能性があることに注意 すること
Copyright Kanmu, Inc. All right reserved. 評価: まとめ 30 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 package 標準errorsとの 互換性 pkg/errorsとの 互換性 スタックトレースの サポート 性能 標準errors - - ❌ - pkg/errors ❌※1 ※2 - ⭕ baseline cockroachdb/errors 🔺※1 ⭕ ⭕ 🔺 goark/errs 🔺※1 🔺 ⭕ ⭕ ※1 いずれもGo1.13時点の互換性あり. Go1.20のJoinは未実装 ※2 今後サポートされる見込みがないため、相対的に悪い評価とした
Copyright Kanmu, Inc. All right reserved. 全体のまとめ 31 5 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • pkg/errors移行先: cockroachdb/errors ◦ pkg/errorsのスーパーセットとなっており、置き換えが容易 ◦ 性能劣化するが、自社のユースケースでは影響度は小さい • ネットワーク >>>> パッケージ移行による速度劣化
Copyright Kanmu, Inc. All right reserved. 参考文献 32 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://go.googlesource.com/go/+/refs/heads/master/src/errors/ • https://github.com/pkg/errors • https://github.com/cockroachdb/errors • https://github.com/goark/errs • https://go.googlesource.com/proposal/+/master/design/go2draft.md • https://go.dev/doc/go1.20 • https://go.dev/doc/go1.13 • https://go.googlesource.com/xerrors/
Copyright Kanmu, Inc. All right reserved. 参考文献 33 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://github.com/morikuni/failure • https://speakerdeck.com/morikuni/designing-errors • https://future-architect.github.io/articles/20230123a/ • https://future-architect.github.io/articles/20230126a/ • https://zenn.dev/nekoshita/articles/097e00c6d3d1c9 • https://text.baldanders.info/golang/error-handling/ • https://zenn.dev/spiegel/books/error-handling-in-golang • https://speakerdeck.com/syumai/godesutatukutoresuwoxi-ufang-fa-ga yayakosiijian-nituite