Iteruj nad polami ciągu w Struct

Szukam iteracji po polach łańcuchowych struktury, dzięki czemu mogę wykonać kilka operacji czyszczenia / sprawdzania poprawności (za pomocąstrings.TrimSpace, strings.Trimitp.)

W tej chwili mam nieuporządkowaną skrzynkę rozdzielczą, która nie jest tak skalowalna, a ponieważ nie ma jej w gorącym miejscu mojej aplikacji (formularza internetowego), wydaje się, żereflect to dobry wybór.

Jestem jednak trochę zablokowany, jak to zaimplementować, a odzwierciedlone dokumenty są dla mnie trochę mylące (przeglądałem inne pakiety walidacyjne, ale są one zbyt ciężkie + używam goryl / schemat już w części unmarshalling):

Iteruj po strukturzeDla każdego pola typu string zastosuj wszystko, co jest potrzebnestrings pakiet, tj.field = strings.TrimSpace(field)Jeśli istnieje pole.Tag.Get („max”), użyjemy tej wartości (strconv.Atoi, a następnie unicode.RuneCountInString)

Podaj wycinek błędu zgodny z typem interfejsu błędu

type FormError []string         

type Listing struct {
        Title string `max:"50"`
        Location string `max:"100"`
        Description string `max:"10000"`
        ExpiryDate time.Time
        RenderedDesc template.HTML
        Contact string `max:"255"`
    }

    // Iterate over our struct, fix whitespace/formatting where possible
    // and return errors encountered
    func (l *Listing) Validate() error {

       typ := l.Elem().Type()

       var invalid FormError
       for i = 0; i < typ.NumField(); i++ {
           // Iterate over fields
           // For StructFields of type string, field = strings.TrimSpace(field)
           // if field.Tag.Get("max") != "" {
           //     check max length/convert to int/utf8.RuneCountInString
                  if max length exceeded, invalid = append(invalid, "errormsg")
       }

       if len(invalid) > 0 {
           return invalid
       } 

       return nil
   }


   func (f FormError) Error() string {
       var fullError string
       for _, v := range f {
           fullError =+ v + "\n"
       }
       return "Errors were encountered during form processing: " + fullError
   }

Z góry dziękuję.

questionAnswers(2)

yourAnswerToTheQuestion