Я ищу итерацию по строковым полям структуры, поэтому я могу выполнить некоторую очистку/проверку (с помощью strings.TrimSpace
, strings.Trim
и т. Д.).Iterate Over String Fields in Struct
Прямо сейчас у меня есть беспорядочный коммутационный футляр, который на самом деле не масштабируемый, и поскольку это не в горячей точке моего приложения (веб-формы), кажется, что использование reflect
- хороший выбор здесь.
Я немного разбираюсь в том, как это реализовать, но документы с отражением немного запутывают меня (я копал некоторые другие пакеты проверки, но они слишком тяжелые + Я использую горилла/схемы для немаршалинг части уже):
- итерации по структурам
- для каждого поля типа строки, применить все, что нужно от
strings
пакета т.е.field = strings.TrimSpace(field)
- Если существует поле. Tag.Get («max»), мы будем использовать это значение (strconv.Atoi, затем unicode.RuneCoun tInString)
Обеспечить срез ошибки, также совместим с типом интерфейса ошибки
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 }
Спасибо заранее.
Отлично, вы очень помогли. Все мои поля экспортируются (структура также отражает мою схему БД), но Validate находится в том же пакете, что и в листинге, поэтому должно быть хорошо. Единственная проблема, с которой я все еще сталкиваюсь, заключается в использовании 'field.Tag.Get (« max »)' - если не поле, что я должен назвать методом «Tag»? http://play.golang.org/p/yMRLFCW4vt – elithrar
Я только что редактировал. Теги являются частью отражения. Тип самой структуры, поэтому вам нужно повторно получить поле из 'msValue.Type()', а затем получить тег из соответствующего поля. – LinearZoetrope
Отлично - это (http://play.golang.org/p/Uks300ZsS3) теперь хорошо работает. Я объявил 'listType: = reflect.TypeOf (* l)' в соответствии с ответом Тайсона, чтобы предоставить ярлык для доступа к полю 'Tag'. В очередной раз благодарим за помощь! – elithrar