5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

go-playground/validatorを用いてカスタムバリデーションルールを作る方法

Posted at

TL;DR

  • go-playground/validatorはバリデーション用ライブラリ
  • すでに存在するルールの他にカスタムバリデーションを作ることができる

go-playground/validatorとは

https://github.com/go-playground/validator
にて公開されているバリデーションライブラリです。

Package validator implements value validations for structs and individual fields based on tags.

Webアプリケーションフレームワークの一つであるgin-gonic/ginのデフォルトバリデーターとて使用されています。(2019年8月8日時点)

構造体のフィールド値をtagに指定されたルールに基づいて検証します。例えば、構造体似次のようなタグを指定することでバリデーションルールを設定することができます。

type User struct {
	FamilyName string `validate:"required"` // 必須項目
	GivenName  string `validate:"required,max=50"` // 必須項目 最大50文字
}

validate := validator.New()
u := Validator{}
err := validate.Struct(u) 
// invalidな場合は`error` interfaceを実装した`validator.ValidationErrors`型が返却されます。

使用できるタグとその使用例については次のドキュメントにて詳細を見ることができます。

go-playground/validatorでは単一のフィールドのみでなく複数のフィールドを利用したバリデーションルールも用意されています。次のような例を見てみましょう。

type Trip struct {
	StartDate time.Time
	EndDate time.Time `validate:"gtcsfield=StartDate"` // StartDateよりも大きい(Greater than StartDate)
}

カスタムバリデーションルールを作る

自前で独自のバリデーションルールを作成したいケースについて説明します。公式では次のURLで説明されています。

次のシグネチャを持つ関数を作成してValidatorに登録することで自前のルール関数を登録することができます。

func(validator.FieldLevel) bool

たとえば、特定の文字列リストに合致するかどうかというルールを作るとする場合、次のような関数を作成することになります。

func customFuncInList(fl validator.FieldLevel) bool {
	ls := []string{
		"list1",
		"list2",
		"list3",
		"list4",
	}
	for _, v := range ls {
		if v == fl.Field().String() {
			return true
		}
	}
	return false
}
validate := validator.New()
validator.RegisterValidation("in-list", customFuncInList) // 登録する

go-playground/validatorを使ったエラーハンドリング

これまで紹介してきたライブラリをWebAPIアプリケーションで使用する場合の方法について次のスライドで解説しています。

Go API Validation error handling

さいごに

go-playground/validatorについて使っていて使い方が忘れてしまう箇所について記事として残しました。

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?