如何在Golang中使用ozzo验证执行条件必要的验证?

In Golang ozzo-validation, how can I validate a field which is dependent on another field ?

For example, if I have the following:

return validation.ValidateStruct(&c,
      validation.Field(&c.Name, validation.Required, validation.Length(5, 20)),

      validation.Field(&c.Gender, validation.In("Female", "Male")),

      validation.Field(&c.Email, is.Email),

      validation.Field(&c.Address),

How can I add a validation that the Address is required only if email is not empty?

You can achieve it in two ways-

  • Adding your own custom rules
  • Conditionally add FieldRules based on precondition-value i.e check Email while creating field rules then supply it to validation.ValidateStruct

For e.g.:

type Sample struct {
    Name    string
    Gender  string
    Email   string
    Address Address
}

type Address struct {
    // ... fields
}

func (s Sample) Validate() error {
    var fieldRules []*validation.FieldRules

    fieldRules = append(fieldRules, validation.Field(&s.Name, validation.Required, validation.Length(5, 20)))
    fieldRules = append(fieldRules, validation.Field(&s.Gender, validation.In("Female", "Male")))
    fieldRules = append(fieldRules, validation.Field(&s.Email, is.Email))

    if len(strings.TrimSpace(s.Email)) > 0 {
        fieldRules = append(fieldRules, validation.Field(&s.Address, validation.Required))
        fieldRules = append(fieldRules, validation.Field(&s.Address))
    }

    return validation.ValidateStruct(&s, fieldRules...)
}