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ツールのデファクトにしたい ○ スターと拡散の協力お願いします!!! ○ まだまだやることたくさんあるので一緒に開発してくれる人を募集し ています!!! まとめ