CheckerContext
go
type CheckerContext struct {
StructValue reflect.Value
FieldName string
FieldType reflect.Type
FieldValue interface{}
FieldLabel string
TemplateLanguage language.Tag
Rule *rule
}各チェッカーが受け取る引数。govalid があなたの関数を呼び出す前に 埋めるので、通常の使用ではあなた自身が構築することはありません。
フィールド
| フィールド | 説明 |
|---|---|
StructValue | 外側の構造体の reflect.Value。これを使って兄弟フィールドを名前で参照。 |
FieldName | Go フィールド名(ラベルではない)。 |
FieldType | フィールドの reflect.Type。 |
FieldValue | 実際の値。型アサーションを行う前提。nil ポインタ/インターフェースのフィールドでは nil の場合があります。 |
FieldLabel | 解決済みラベル文字列(ロケール対応)。 |
TemplateLanguage | 現在の Check 呼び出しのアクティブロケール。 |
Rule | パース済みルールへのポインタ。Rule.params はタグパラメータの []string。 |
レシピ
タグパラメータを読む
go
if len(c.Rule.params) == 0 {
return govalid.MakeCheckerParamError(c)
}
limit, err := strconv.Atoi(c.Rule.params[0])兄弟フィールドを参照する
go
sv := c.StructValue
for i := 0; i < sv.Type().NumField(); i++ {
if sv.Type().Field(i).Name == "Other" {
v := sv.Field(i).Interface()
// ...
}
}安全な型アサーション
go
v, ok := c.FieldValue.(string)
if !ok {
return govalid.MakeValueTypeError(c)
}ローカライズされたエラーを構築
go
return govalid.NewErrorContext(c)NewErrorContext は c.Rule.checker を読み取って正しいテンプレート を引き、c.TemplateLanguage を適用し、先頭に c.FieldLabel を付け ます。SetMessageTemplates で 1 度メッセージを登録するだけで済みます。