Skip to content

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。用它按名查兄弟字段。
FieldNameGo 字段名(不是 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 注册一次消息即可。

基于 MIT 协议发布。