🗂

Go言語でカスタムバリデーションを作成

2022/09/23に公開

概要及び前提条件

・構造体の個々の要素に対してバリデーションを実装する。
・独自のバリデーションを作成する。
・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