我在寻找一个struct的字符串字段遍历,所以我可以做一些清理/验证(与strings.TrimSpace
,strings.Trim
等)。
现在我有一个杂乱的开关盒,它不是真正可扩展的,而且由于它不在我的应用程序(Web 表单)的热点中,因此reflect
在这里利用似乎是一个不错的选择。
然而,我在如何实现这一点上遇到了一些障碍,反射文档让我有点困惑(我一直在研究其他一些验证包,但它们太重量级了 + 我正在使用解组部分的大猩猩/模式已经):
遍历结构
对于字符串类型的每个字段,从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
}
相关分类