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
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
1.2k
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
150
ChromeでローカルLLM
ryu1013
0
140
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
golang-bob.pdf
iwatsukayura
0
130
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.2k
Featured
See All Featured
Abbi's Birthday
coloredviolet
4
10k
Building an army of robots
kneath
307
47k
WENDY [Excerpt]
tessaabrams
14
40k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Curse of the Amulet
leimatthew05
3
16k
Tell your own story through comics
letsgokoyo
1
1.1k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
570
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
730
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
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