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.Trim
itp.)
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ę.