タグリファレンス
govalid は 3 つの構造体タグを読みます。デフォルト名はパッケージ レベル変数で設定可能で、他のタグ名前空間と共存させたいときは起動 時に一度だけ設定します。
| タグ | デフォルト名 | 変数 |
|---|---|---|
| バリデーションルール | valid | govalid.RulesField |
| フィールドラベル | label | govalid.LabelField |
| メッセージ上書き | msg | govalid.MessageField |
go
// 例:他のタグ名前空間と共存
govalid.RulesField = "validate"
govalid.LabelField = "name"valid —— ルールリスト
valid は ; 区切りのルールリスト です。各ルールは次のいずれか:
- 単純なチェッカー名:
required - パラメータ付きチェッカー、
,区切り:min:0、list: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 呼び出しでの探索順:
- 要求されたロケールの
label-<lang> label(無サフィックスのデフォルト)- 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"`
}