TL;DR
- go-playground/validatorはバリデーション用ライブラリ
- すでに存在するルールの他にカスタムバリデーションを作ることができる
go-playground/validatorとは
https://github.com/go-playground/validator
にて公開されているバリデーションライブラリです。
Package validator implements value validations for structs and individual fields based on tags.
Webアプリケーションフレームワークの一つであるgin-gonic/ginのデフォルトバリデーターとて使用されています。(2019年8月8日時点)
構造体のフィールド値をtagに指定されたルールに基づいて検証します。例えば、構造体似次のようなタグを指定することでバリデーションルールを設定することができます。
type User struct {
FamilyName string `validate:"required"` // 必須項目
GivenName string `validate:"required,max=50"` // 必須項目 最大50文字
}
validate := validator.New()
u := Validator{}
err := validate.Struct(u)
// invalidな場合は`error` interfaceを実装した`validator.ValidationErrors`型が返却されます。
使用できるタグとその使用例については次のドキュメントにて詳細を見ることができます。
go-playground/validatorでは単一のフィールドのみでなく複数のフィールドを利用したバリデーションルールも用意されています。次のような例を見てみましょう。
type Trip struct {
StartDate time.Time
EndDate time.Time `validate:"gtcsfield=StartDate"` // StartDateよりも大きい(Greater than StartDate)
}
カスタムバリデーションルールを作る
自前で独自のバリデーションルールを作成したいケースについて説明します。公式では次のURLで説明されています。
次のシグネチャを持つ関数を作成してValidatorに登録することで自前のルール関数を登録することができます。
func(validator.FieldLevel) bool
たとえば、特定の文字列リストに合致するかどうかというルールを作るとする場合、次のような関数を作成することになります。
func customFuncInList(fl validator.FieldLevel) bool {
ls := []string{
"list1",
"list2",
"list3",
"list4",
}
for _, v := range ls {
if v == fl.Field().String() {
return true
}
}
return false
}
validate := validator.New()
validator.RegisterValidation("in-list", customFuncInList) // 登録する
go-playground/validatorを使ったエラーハンドリング
これまで紹介してきたライブラリをWebAPIアプリケーションで使用する場合の方法について次のスライドで解説しています。
Go API Validation error handling
さいごに
go-playground/validatorについて使っていて使い方が忘れてしまう箇所について記事として残しました。