CheckerContext
go
type CheckerContext struct {
StructValue reflect.Value
FieldName string
FieldType reflect.Type
FieldValue interface{}
FieldLabel string
TemplateLanguage language.Tag
Rule *rule
}每个校验器收到的参数。govalid 在调用你的函数前会把它填好——正常 使用中你不需要自己构造它。
字段
| 字段 | 说明 |
|---|---|
StructValue | 外层 struct 的 reflect.Value。用它按名查兄弟字段。 |
FieldName | Go 字段名(不是 label)。 |
FieldType | 字段的 reflect.Type。 |
FieldValue | 实际的值,已经准备好做类型断言。空指针/接口字段时可能是 nil。 |
FieldLabel | 已解析的 label 字符串(locale 感知)。 |
TemplateLanguage | 当前 Check 调用对应的 locale。 |
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 注册一次消息即可。