【发布时间】:2014-01-21 00:02:48
【问题描述】:
我希望遍历结构的字符串字段,以便进行一些清理/验证(使用strings.TrimSpace、strings.Trim 等)。
现在我有一个杂乱无章的开关盒,它不是真正可扩展的,而且由于它不在我的应用程序(网络表单)的热点中,因此利用 reflect 似乎是一个不错的选择。
然而,我在如何实现这一点上遇到了一些障碍,并且反射文档让我有点困惑(我一直在研究其他一些验证包,但它们太重了 + 我'我已经在使用 gorilla/schema 作为解组部分):
- 遍历结构
- 对于字符串类型的每个字段,从
strings包中应用我需要的任何内容,即field = strings.TrimSpace(field) - 如果存在 field.Tag.Get("max"),我们将使用该值(strconv.Atoi,然后是 unicode.RuneCountInString)
-
提供一个也与错误接口类型兼容的错误切片
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 }
提前致谢。
【问题讨论】:
标签: go