Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
kanazawa.go 2025.07.27
Search
o-ga
July 26, 2025
72
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
kanazawa.go 2025.07.27
o-ga
July 26, 2025
More Decks by o-ga
See All by o-ga
GoConferenceMini2026inSendai_-_2026.02.21.pdf
tabe
0
21
GoConnect#9 2025.08.19
tabe
0
89
ランドネットLT会.pdf
tabe
0
23
Tavinikkiyとかいう構想半年、開発2ヶ月みたいなプロダクトを個人開発している話
tabe
0
19
テテミート 2024.11.22
tabe
0
16
Genericsについて改めて学んでみた
tabe
0
58
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Claude Code のすすめ
schroneko
67
230k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Facilitating Awesome Meetings
lara
57
7k
Scaling GitHub
holman
464
140k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
So, you think you're a good person
axbom
PRO
2
2.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
Side Projects
sachag
455
43k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Transcript
govalid を使ってみた govalid を使ってみた govalid を使ってみた govalid を使ってみた govalid を使ってみた
govalid を使ってみた govalid を使ってみた govalid を使ってみた govalid を使ってみた govalid を使ってみた Kanazawa.go LT 2025年7月27日 1
自己紹介 自己紹介 自己紹介 自己紹介 自己紹介 自己紹介 自己紹介 自己紹介 自己紹介 自己紹介
名前: オーガ 職業: バックエンドエンジニア 好きな言語: Go, TypeScript 趣味: ライブに行く、日本酒、Go を書く 推し: 山本彩、福山梨乃 Twitter: @o_ga09 GitHub: @o-ga09 2
Go Conference Go Conference Go Conference Go Conference Go Conference
Go Conference Go Conference Go Conference Go Conference Go Conference 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 2025 2 日間開催決定! 1 日目は誕生日!! めっちゃうれしい!!! 3
今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと 今日話すこと
govalid とは? 実装例 まとめ 4
訂正 訂正 訂正 訂正 訂正 訂正 訂正 訂正 訂正 訂正
本スライドは、使ってみたではなく、紹介です! すみません 5
govalid とは? govalid とは? govalid とは? govalid とは? govalid とは?
govalid とは? govalid とは? govalid とは? govalid とは? govalid とは? sivchari さんが OSS で開発している Go 言語のための構造体バリデーションライブラリ コメントベースのバリデーション指定 豊富な組み込みバリデーションルール go-playground/validator から乗り換え可能&乗り換えることで5倍速くな る 6
なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid
なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid なぜ、go-validator ではなく、govalid か? か? か? か? か? か? か? か? か? か? go-playground/validator は、構造体のタグベースなので reflect を使用している 実行時に動的に評価してバリデート 7
デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指 デメリットだなぁと指
摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 摘されている点 主な課題 主な課題 主な課題 主な課題 主な課題 主な課題 主な課題 主な課題 主な課題 主な課題 OpenAPI 生成への影響 コメントが OpenAPI ドキュメントのノイズになる 可読性の問題 フィールド毎のコメントで構造体が見づらくなる パフォーマンス疑問 reflect の問題を体感したことがない(個人的経験) レイアウトの乱れ フィールド、型、タグの位置が揃わない 8
まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール! まずは、インストール!
go install github.com/sivchari/govalid/cmd/govalid@latest 9
実装例 実装例 実装例 実装例 実装例 実装例 実装例 実装例 実装例 実装例
//go:generate govalid . type User struct { // +govalid:required Name string `json:"name"` // +govalid:required // +govalid:email Email string `json:"email"` // +govalid:gte=0 // +govalid:lte=120 Age int `json:"age"` } 使用可能なバリデーション 10
コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成 コマンドでバリデーションコードを自動生成
go generate ./... 11
govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方
govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方 govalid の基本的な使い方 func main() { p := &Person{Name: "John", Email: "invalid-email"} if err := ValidatePerson(p); err != nil { log.Printf("Validation failed: %v", err) // Output: Validation failed: field Email must be a valid email address } } 12
実装例: API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 実装例:
API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 実装例: API リクエストの検証 func CreateUser(w http.ResponseWriter, r *http.Request) { var user User // リクエストボディをデコード decoder := json.NewDecoder(r.Body) if err := decoder.Decode(&user); err != nil { http.Error(w, "Invalid request", http.StatusBadRequest) return } // バリデーション実行 if _, err := govalidator.ValidateStruct(user); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // 処理続行... } 13
まとめ まとめ まとめ まとめ まとめ まとめ まとめ まとめ まとめ まとめ
govalid は簡単に導入できるコメントベースのバリデーションライブラリ コメントからバリデーションメソッドが自動生成され事前コンパイルされた形式でバリデ ートされる 実行時に reflaction による評価ではない つい先日、 ️100 行ったばかり! OSS です! 14
govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想
govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想 govalid を少し使ってみた感想 AI に書かせるのは全然無理 go-playground/validator を使おうとしてくる 本当にリクエストバリデーションのパフォーマンスで悩むなら、選択肢としてありだなぁ コメント少し可読性が下がるかもだが、全然使うのありだな 15
参考 参考 参考 参考 参考 参考 参考 参考 参考 参考
sivchari/govalid Go の次世代バリデーションツール govalid 16
Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました
Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました Go 清聴ありがとうございました 17