Skip to content

タグリファレンス

govalid は 3 つの構造体タグを読みます。デフォルト名はパッケージ レベル変数で設定可能で、他のタグ名前空間と共存させたいときは起動 時に一度だけ設定します。

タグデフォルト名変数
バリデーションルールvalidgovalid.RulesField
フィールドラベルlabelgovalid.LabelField
メッセージ上書きmsggovalid.MessageField
go
// 例:他のタグ名前空間と共存
govalid.RulesField = "validate"
govalid.LabelField = "name"

valid —— ルールリスト

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

  • 単純なチェッカー名:required
  • パラメータ付きチェッカー、, 区切り:min:0list:a,b,c
go
`valid:"required;min:18;max:120"`
`valid:"required;username;minlen:3;maxlen:20"`
`valid:"list:admin,editor,viewer"`

パーサーの細かい挙動

  • 末尾・先頭の ; は寛容に無視されます。
  • ;; の間にある空ルールはスキップされます。
  • valid:"required:" のような空パラメータリストは空文字パラメータ を 1 つ生成し、多くのチェッカーがパラメータエラーとして拒否します。
  • 最初の : 以降はそのままパラメータ文字列です——だから url:http://example.com はチェッカー url、パラメータ http://example.com の 1 つとしてパースされます。

ルールの実行順序

ルールは 左から右 へ順に実行されます。失敗するごとに *ErrContext が生成され、次のルールへ実行が続きます——フィールド に msg 上書きが付いている場合を除きます(下記参照)。

go
type Form struct {
    Score int `valid:"required;min:0;max:100" label:"得分"`
}
// Score = -1 → "得分应大于0"
// Score = 200 → "得分应小于100"
// Score = 0 → エラーなし

label —— わかりやすい名前

label はエラーメッセージの先頭に付きます。指定しない場合 govalid は Go フィールド名にフォールバックします。

go
type Form struct {
    Email string `valid:"required" label:"电子邮箱"`
}
// → "电子邮箱不能为空"

ロケールごとのラベル

label-<lang> タグでロケール別のラベルを付けられます。lang サフィ ックスは language.Tag.String() に対応します:

go
type Form struct {
    Email string `valid:"required" label:"邮箱" label-en:"Email"`
}

govalid.Check(form, language.English)
// → "Email can not be empty"

Check 呼び出しでの探索順:

  1. 要求されたロケールの label-<lang>
  2. label(無サフィックスのデフォルト)
  3. Go フィールド名

msg —— メッセージを上書き

msg はそのフィールドの 最初に 失敗したルールのエラーメッセージ 全体を置き換えます。後続のルールは評価されません。

go
type Form struct {
    Password string `valid:"required;minlen:8;maxlen:64" label:"密码" msg:"密码长度需在 8-64 之间"`
}
// 空のパスワード → "密码长度需在 8-64 之间"
// 4 文字のパスワード → "密码长度需在 8-64 之间"

TIP

プロダクトコピーが原因の細かさより重要なときに msg を使います。 複数メッセージ UI が要るときは msg を省き、ロケールのテンプレート に喋らせてください。

タグ組み合わせ早見表

go
type Profile struct {
    // required + フォーマット検査、デフォルトの中国語ラベル。
    Email string `valid:"required;email" label:"邮箱"`

    // オプショナルだが値があれば形式チェック。
    Backup string `valid:"email"          label:"备用邮箱"`

    // カスタムメッセージがすべてを上書き。
    Phone  string `valid:"required;mobile" label:"手机号" msg:"请输入有效的手机号"`

    // ロケール別ラベル。
    Name   string `valid:"required" label:"姓名" label-en:"Name"`

    // クロスフィールド参照は Go フィールド名。
    Repeat string `valid:"equal:Password"`
}

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