🗂
Go言語でカスタムバリデーションを作成
概要及び前提条件
・構造体の個々の要素に対してバリデーションを実装する。
・独自のバリデーションを作成する。
・JSON-RPC通信を想定
バージョン
go1.18
github.com/go-playground/validator/v10
構造体
type PersonParams struct {
firstName string `json:"firstName" validate:"required"` //デフォルトで使用可能な必須チェックを行うバリデーション。
age int `json:"age" validate:"required,age-limit"`//カスタムバリデーション。独自の条件でバリデーションを作成し使用できるようにする。
}
※補足
JSON-RPCでフロントエンドと通信を想定しているためjsonタグを使用。
当記事とは関係のないため詳しい解説は省略するが、イメージとしてはWebサーバーやDBサーバーとのやりとりの際にこのタグ名を使用してデータ参照できるようにしている。
カスタムバリデーションの実装
import "github.com/go-playground/validator/v10"
var validate = validator.New()
func init() {
//第一引数に任意のタグ名、第二引数に独自のバリデーションを定義する任意の関数名
validate.RegisterValidation("age-limit", ageLimit)
//バリデーション関数の作成
func ageLimit(fl validator.FieldLevel) bool {
a, ok := fl.Field().Interface().(int)
if !ok {
return false
}
if a < 20 {
return false
}
return true
}
}
上記のバリデーションは未成年であればサーバーエラーを返すバリデーションとなります。
最後に
デフォルトで用意されているパターン(必須や文字数など)以外でバリデーションをかけたいことは多々あるかと思うので、バリデーションを自作できるようにしておくと良いと思います。
Discussion