体はドクペで出来ている

インフラ、Goの割合が多い技術ブログ

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で使えそうなものが無いかチェックしてみると良いでしょう。