如何通过Planner为嵌套字段Email添加Go validator自定义标签?
问题解答
官方的go-playground/validator不支持你示例中这种通过嵌入结构体标签指定内部字段验证规则的写法。它对嵌入结构体的validator标签解析逻辑是针对整个嵌入结构体本身,而非其内部字段。
可行解决方案
1. 重写字段并复用原有标签
直接在Planner结构体中重写Email字段,保留原有的GORM标签并添加新的验证标签:
type Planner struct { AbstractAccount Email string `gorm:"unique;type:varchar" validator:"customTag"` }
注意:重写字段会覆盖嵌入结构体的同名字段,因此需要完整复制原有标签,避免丢失ORM配置。
2. 自定义结构体级验证
注册自定义验证规则后,针对Planner结构体编写单独的验证逻辑,手动校验Email字段:
import ( "fmt" "strings" "github.com/go-playground/validator/v10" ) var validate *validator.Validate func init() { validate = validator.New() // 注册自定义验证规则 _ = validate.RegisterValidation("customTag", func(fl validator.FieldLevel) bool { email := fl.Field().String() // 此处替换为你的自定义验证逻辑 return strings.HasSuffix(email, "@planner.example") }) } func ValidatePlanner(p Planner) error { // 先执行基础结构体验证 if err := validate.Struct(p); err != nil { return err } // 单独校验Email的customTag规则 if !strings.HasSuffix(p.Email, "@planner.example") { return fmt.Errorf("email must end with @planner.example") } return nil }
3. 使用更灵活的第三方验证库
比如ozzo-validation,它支持在验证方法中直接为嵌套字段指定规则,无需修改结构体标签:
import ( "regexp" "github.com/go-ozzo/ozzo-validation/v4" "github.com/go-ozzo/ozzo-validation/v4/is" ) func (p Planner) Validate() error { return validation.ValidateStruct(&p, validation.Field(&p.Email, validation.Required, is.Email, validation.Match(regexp.MustCompile(`^[a-z0-9._%+-]+@planner\.example$`))), ) }
内容的提问来源于stack exchange,提问作者pham vu
相关产品推荐
相关产品推荐

