Golangでバリデーションチェックを行う
本章では、Go言語でバリデーションチェックを行う方法について共有します。
前提
WEBアプリで利用する目的で、バリデーションチェックを準備します。構成は、以下の通りです。
- forms
- webのリクエストフォームを定義した構造体。バリデーションチェックで利用するルールも定義します。
- webs
- ユーザーからの入力を上記構造体に入れ、入力内容を検証します。
プログラム
まず、リクエストフォームを定義した構造体を準備します。validatorとして、以下のライブラリを利用します。
godoc.org
構造体のタグに「validate」を記述し、検証方法を定義します。今回のサンプルを例にすると、以下の通りです。
- reguired
- 入力が必須であること
- min=n
- 最小文字数n文字であること
- max=n
- 最大文字数がn文字であること
- alpha
- アルファベットのみであること
- email
- Email形式であること
[forms/user.go]
package forms import ( "gopkg.in/go-playground/validator.v9" ) type User struct { Name string `validate:"required,min=5,max=25,alpha"` FirstName string `validate:"required"` LastName string `validate:"required"` Email string `validate:"required,email"` } // バリデーションチェックを行って、結果とNGの場合にエラーメッセージ群を返す func (form *User) Validate() (ok bool, result map[string]string) { result = make(map[string]string) // 構造体のデータをタグで定義した検証方法でチェック err := validator.New().Struct(*form) if err != nil { errors := err.(validator.ValidationErrors) if len(errors) != 0 { for i := range errors { // フィールドごとに、検証 switch errors[i].StructField() { case "Name": switch errors[i].Tag() { case "required", "min", "max", "alpha": result["Name"] = "5文字以上25文字以下のアルファベットで入力してください" } case "FirstName": switch errors[i].Tag() { case "required": result["FirstName"] = "名を入力してください" } case "LastName": switch errors[i].Tag() { case "required": result["LastName"] = "姓を入力してください" } case "Email": switch errors[i].Tag() { case "required", "email": result["Email"] = "正しいメールアドレス形式で入力してください" } } } } return false, result } return true, result }
次に、ユーザーからのリクエストを捌くコントローラーを準備します。
[webs/user.go]
package webs import ( "fmt" "html/template" "net/http" "strconv" "strings" ) func SaveUser(w http.ResponseWriter, r *http.Request) { // リクエスト内容を構造体に格納する form := forms.User{ Name: r.FormValue("name"), FirstName: r.FormValue("firstName"), LastName: r.FormValue("lastName"), Email: r.FormValue("email"), } // バリデーションの検証を行う if ok, errorMessages := form.Validate(); !ok { // バリデーションエラー結果「result["hogehoge"]」をhtmlのtemplateに返して、表示させる } // 後続の処理を行う }
筆休め
WEBサイトを作る上で、ユーザーからの入力内容を検証することは必須です。Go言語では、バリデーションチェックを行うライブラリは内蔵されていないため、少し工夫が必要になります。
以上、「Golangでバリデーションチェックを行う」でした。