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が空でなければ空を許容 }