Skip to content

クイックスタート

このページでは、govalid をインストールして 5 分以内に最初の構造体 バリデーションを実行するまでを案内します。

必要な環境

  • Go 1.16 以上
  • module 対応のプロジェクト(go.mod

インストール

sh
go get -u github.com/wuhan005/govalid

そしてコード内で import します:

go
import "github.com/wuhan005/govalid"

最初のバリデーション

バリデートしたいフィールドに valid タグを付け、必要に応じて label でわかりやすい名前を付けます:

go
package main

import (
    "fmt"

    "github.com/wuhan005/govalid"
)

func main() {
    form := struct {
        Name  string `valid:"required;username" label:"昵称"`
        ID    int    `valid:"required;min:0;max:999" label:"用户编号"`
        Email string `valid:"required;email"    label:"邮箱"`
    }{
        Name:  "e99_",
        ID:    1990,
        Email: "i@github.red.",
    }

    errs, ok := govalid.Check(form)
    if ok {
        fmt.Println("OK")
        return
    }
    for _, err := range errs {
        fmt.Println(err)
    }
}
text
昵称的最后一个字符不能为下划线
用户编号应小于999
邮箱不是合法的电子邮箱格式

何が起こったのか?

  1. Check がリフレクションで構造体を辿りました。
  2. valid タグを持つ各フィールドについて、すべてのルール (; 区切り)がグローバルな Checkers レジストリで解決され、 順番に実行されました。
  3. 失敗した各ルールは *ErrContext を生成し、フィールド名・ラベル・ 値・ローカライズされたメッセージを保持します。*ErrContext 自体 が error インターフェースを実装しています。
  4. すべてのルールが通った時のみ oktrue になります。

ルールの構造

valid タグは ; 区切りのルールリストです。各ルールは次のいずれか:

  • 単純なチェッカー名:required
  • パラメータ付きチェッカー:min:18list:admin,editor,viewer
go
`valid:"required;min:18;max:120"`

TIP

フォーマット系チェッカー(emailipv4mobile など)は空文字 を「OK」とショートサーキットします。required と組み合わせること でフィールドのオン/オフを切り替えられます:

go
type Form struct {
    Optional string `valid:"email"`            // 空を許容
    Required string `valid:"required;email"`   // 空を拒否
}

フィールド単位のカスタムエラーメッセージ

msg タグでフィールドのエラーメッセージ全体を上書きできます。最初 に失敗したルールが直接このメッセージにショートサーキットします ——プロダクトコピーを細かい原因より優先したい時に便利です:

go
type Form struct {
    Password string `valid:"required;minlen:8" label:"密码" msg:"密码长度需在 8-64 之间"`
}

クロスフィールド & ビジネスルール

複数フィールドに依存するロジックは Validate() error メソッドに 書きます。govalid はタグルールの後にこれを呼びます:

go
type Form struct {
    Password       string `valid:"required;minlen:8" label:"密码"`
    RepeatPassword string `valid:"required"          label:"重复密码"`
}

func (f *Form) Validate() error {
    if f.Password != f.RepeatPassword {
        return errors.New("两次输入的密码不一致")
    }
    return nil
}

完全な仕様は クロスフィールド & ビジネスルール を参照してください。

次はどこへ?

MIT ライセンスのもとで公開されています。