govalid ~ Type-safe validation tool ~
by
sivchari
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
govalid ~ Type-safe validation tool ~ 02/26/2025 sivchari newmo Inc The Go gopher was designed by Renée French.
Slide 2
Slide 2 text
自己紹介 Goのバリデーションツール 既存ツールの問題点 govalid govalidの仕組み まとめ
Slide 3
Slide 3 text
自己紹介
Slide 4
Slide 4 text
● sivchari ○ X/GitHub @sivchari ● newmo ● Kubernetes maintainer ○ Cluster API ○ Kube API Linter ● Go Conference メインオーガナイザー
Slide 5
Slide 5 text
Goのバリデーションツール
Slide 6
Slide 6 text
● 有名どころは ○ go-playground/validator ● 他にも ○ asaskevich/govalidator ○ go-ozzo/ozzo-validation Goのバリデーションツール
Slide 7
Slide 7 text
既存ツールの問題点
Slide 8
Slide 8 text
● reflect依存のバリデーション ○ reflectは実行時評価なのでパフォーマンスが悪い ○ structのバリデーションだとネストしてくるとその分評価に時間が かかり、reflectする回数が増える ○ 大規模リクエストを受ける時にいくらパフォーマンスを上ても致命的 で手動でバリデーションする?? 既存ツールの問題点
Slide 9
Slide 9 text
govalid ~ Type-safe validation tool ~
Slide 10
Slide 10 text
● https://github.com/sivchari/govalid ○ 型安全にバリデーションコードを自動生成する ○ kubebuilderを意識したmarker指向でコード生成を制御する ○ 公式ページ ■ https://sivchari.github.io/govalid/ govalid
Slide 11
Slide 11 text
● ○ 型安全にバリデーションコードを自動生成する ○ kubebuilderを意識したmarker指向でコード生成を制御する ○ 公式ページ ■ https://sivchari.github.io/govalid/ govalid
Slide 12
Slide 12 text
● https://sivchari.github.io/govalid/examples/ ○ コメントベースを書くだけ ○ 生成された関数に置き換えるだけ ○ govalidの生成コードは標準パッケージがメイン ■ 一部依存パッケージあり govalid
Slide 13
Slide 13 text
● VS reflection-based validators ○ 全部のバリデーションツールに対して圧倒的勝利 ■ https://sivchari.github.io/govalid/benchmarks/ ○ ex. ■ go-playgroundのRequiredに約40倍 ■ URLのような複雑なvalidationでも約5倍 ● ozzo-validationに対しては186倍 govalid
Slide 14
Slide 14 text
govalidの仕組み
Slide 15
Slide 15 text
● メインはast ○ markers analyzerがそれぞれのstructやフィールドに紐づいたmarker を集める ○ govalidがmarker analyzerの結果を受け取りコード生成を行う govalidの仕組み
Slide 16
Slide 16 text
● ResultとFact ○ Result ■ Analyzerが解析した結果をほかAnalyzerに伝搬するための仕組み ■ ResultTypeで指定できる ○ Fact ■ 特定のオブジェクトに対してどのようなことがあったか記録するための 仕組み ■ FactTypeで指定できる govalidの仕組み
Slide 17
Slide 17 text
govalidの仕組み
Slide 18
Slide 18 text
govalidの仕組み ● Factはテスト可能 ○ linterのテストのようにwantで書いて同じ内容が出力されて いるか確認する
Slide 19
Slide 19 text
まとめ
Slide 20
Slide 20 text
● reflection-based validationの不満を解決するツールを作ったよ ○ Goの自動生成の強みを活かしたvalidationツール ○ Goのvalidationツールのデファクトにしたい ○ スターと拡散の協力お願いします!!! ○ まだまだやることたくさんあるので一緒に開発してくれる人を募集し ています!!! まとめ