エラーメッセージ
govalid のエラーシステムは、すぐ使えて、上書きが些細であるよう 設計されています。失敗したルールごとに *ErrContext が生成され、 その Error() は 3 つのピースから組み立てられた可読な文字列を 返します:
- フィールドの ラベル(例:
"邮箱") - ルールの テンプレート(例:
"不能为空") - ルールの 制限値(あれば。例:
max:100に対する100)
例:ラベル "评分" 上の min:0 は "评分应大于0" を生成します。
フィールド単位の上書き:msg
メッセージを変える最も単純な手段は構造体フィールド上の msg タグ です。最初に失敗したルールがそのテキストにショートサーキットします:
type Form struct {
Password string `valid:"required;minlen:8;maxlen:64" label:"密码" msg:"密码长度需在 8-64 之间"`
}プロダクトコピーが原因の細かさより重要な時に msg を使ってください。
ルールテンプレートの差し替え
SetMessageTemplates はあなたの上書きをロケールのテンプレート セットへマージします。デフォルトロケールは中国語です;別のロケール を更新したい場合は language.Tag を渡します:
govalid.SetMessageTemplates(map[string]string{
"required": "can not be null",
"min": "must be greater than",
})
govalid.SetMessageTemplates(map[string]string{
"required": "must not be empty",
}, language.English)テンプレートの構造
テンプレートはプレースホルダーを含むことも、 {{ … }} で包むこともできます:
| パターン | 効果 |
|---|---|
プレーン文字列("不能为空") | フィールドラベルが前置、制限値が非 nil なら末尾に追加 |
{field} / {limit} を含む | プレースホルダーがそのまま置換される |
{{ … }} で包まれている | ラベルの前置と制限値の末尾追加を完全にスキップ |
govalid.SetMessageTemplates(map[string]string{
"min": "{{字段 {field} 必须 ≥ {limit}}}",
})
// → "字段 Score 必须 ≥ 10" (ラベル前置なし、制限値末尾なし)プレースホルダー定数 FieldNamePlaceholder = "{field}" と FieldLimitPlaceholder = "{limit}" は公開されているので、設定から テンプレートを組み立てる場合に参照できます。
診断テンプレート
govalid は診断用に 3 つの内部テンプレートを使います。すべて _ で 始まります:
| キー | 使われる時 |
|---|---|
_checkerNotFound | タグが未登録のチェッカーを参照 |
_unknownErrorTemplate | カスタムチェッカーが未マップのキーに到達 |
_paramError | タグのパラメータが欠落・不正 |
_valueTypeError | 実行時種別がチェッカーで未サポート |
_fieldNotFound | クロスフィールドルールが存在しないフィールドを参照 |
通常のルールと同じく上書きできます:
govalid.SetMessageTemplates(map[string]string{
"_checkerNotFound": "未知的校验规则",
})プログラムからのアクセス
返ってきた errs スライスの各エントリは *ErrContext で、公開 フィールドを内省できます:
errs, ok := govalid.Check(form)
if !ok {
for _, e := range errs {
log.Printf("[%s] label=%q value=%v -> %s",
e.FieldName, e.FieldLabel, e.FieldValue, e)
}
}後からエラーを書き換える
*ErrContext はメッセージを後から微調整するための 2 つのミューテー ターを公開しています——典型的にはカスタムチェッカー内で使います:
ctx := govalid.NewErrorContext(c)
ctx.SetTemplate("alphadash") // 別のテンプレートに完全に切り替え
ctx.SetFieldLimitValue(42) // 新しい制限値で再描画SetTemplate は以前に保存された制限値をクリアするので、 "name can not be empty<old limit>" のようなメッセージがテンプレート 間で漏れることはありません。