go-playground/validatorでバリデーションを行う時のメモ
入門
Go言語で構造体のメンバーに対してバリデーションを行いたいというのはよくあるケースかと思います。
これを正規表現でチマチマやるのは中々に面倒だと思いますが、go-playground/validatorを使えば下記のように所定のルールに沿ったタグを付けることで簡単に実現できます。
type employee struct { Id int `validate:"-"` FirstName string `validate:"required,max=85"` LastName string `validate:"required,max=85"` }
この例の場合、下記のようなバリデーションルールになります。
- Id
- バリデーション無し
- FirstName
- 1文字以上85文字以下
- LirstName
- 1文字以上85文字以下
複数のバリデーションルールを指定したい場合
既に上記の例がそうなっていますが,
で区切ることにより複数のルールを指定することができます。
string と int による挙動の違い
requiredを指定した場合
簡潔に言えば「Golangのデフォルト値はNG」です。
つまりint型なら0
はダメ、string型なら""
がダメでそれ以外ならOKになります。
max, min等の数値を指定した場合
string型では文字数でカウントされるのでmax=85
なら85以下、min=1
なら1字以上となります。
バイト数ではないのでuboa
でもウボァー
でも4文字です。
int型では値そのままです。
諸注意
定義されていないバリデーションルールを指定した場合
例えばrequired
としたかったところをrequire
などと指定するとお察しの通りバリデーション実行時にpanic
が発生します。
ビルド時にはエラーとならないためきちんと単体テストを行うようにして防止する必要があります。
$ go run tuf.go Undefined validation function 'require' on field 'FirstName' goroutine 5 (以下略)
構造体に複数のタグを付ける場合
go-playground/validatorに限った話ではないですが、下記のようにバッククォート中にスペースで区切ることで複数のタグを指定できます。
type employee struct { Id int `json:"id" validate:"-"` FirstName string `json:"firstname" validate:"required,max=85"` LastName string `json:"lastname" validate:"required,max=85"` }
その他
上記のような極基本的なルール以外にも「ASCIIだけOK」や「ipv4だけOK」のような色々便利そうなルールが多数ありますので、バリデーションをしたくなったらまずはgo-playground/validatorのGoDocで使えそうなものが無いかチェックしてみると良いでしょう。