技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

validator【Go】

ライブラリvalidatorを使って、structのバリデーションを行うことができます。

基本的な使い方は公式ドキュメントQiitaの優良記事に譲るとして、ここでは備忘の意味も込めて、私が引っかかった点を紹介します。

ペアにしたフィールドのうち、全てが空にならないように制約する

「いくつかのフィールドのうち、いずれかが空でなければいい」というパターンがあるかと思います。

そんな時はrequired_withoutを使います。

type param struct {
    A string `json:"a" validate:"-"`
    B string `json:"b" validate:"required_without=C"`    // Cが空だったら必須
    C  string `json:"c" validate:"required_without=B"`    // Bが空だったら必須
}


omitemptyは順序に注意

omitemptyは空を許容する指定ですが、空でない場合は後に記載されているvalidate指定を適用します。

type param struct {
    A string `json:"a" validate:"omitempty, email"`
}


上記例では、フィールドAが空ではなかったらemailのフォーマットに沿っているかを検証します。

omitemptyをemailの後に書いてしまうと、空の場合でもemail制約がかかってしまいます。



また、先ほどのrequired_withoutと組み合わせるときは次のようにします。

type param struct {
    A string `json:"a" validate:"required_without=B"`    // Bが空だったら必須
    B  string `json:"b" validate:"required_without=A", omitempty, email`    // Aが空だったらemail形式の上、必須。Aが空でなければ空を許容
}