我正在寻找迭代结构的字符串字段,所以我可以做一些清理/验证(使用strings.TrimSpace
,strings.Trim
等)。迭代结构中的字符串字段
现在我有一个混乱的开关柜,这不是真的可扩展的,因为这不是我的应用程序(网络表单)的热点,它似乎利用reflect
是一个很好的选择。
但是,我对如何实现这一点有点阻碍,而且反射文档对我来说有点混乱(我一直在挖掘其他一些验证包,但它们太重量级了+我使用的是大猩猩/架构解组部分的话):
- 遍历结构
- 对于字符串类型的各个领域,适用任何我需要从
strings
包即field = strings.TrimSpace(field)
- 如果有存在一个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与Listing相同,因此应该没问题。我仍然唯一的问题是使用'field.Tag.Get(“max”)' - 如果不是字段我应该调用'Tag'方法吗? http://play.golang.org/p/yMRLFCW4vt – elithrar
我刚刚做了一个编辑。标签是结构本身的reflect.Type的一部分,所以你必须从msValue.Type()中重新获得该字段,然后从相应的字段中获取标签。 – LinearZoetrope
太棒了 - 这个(http://play.golang.org/p/Uks300ZsS3)现在运行良好。我根据Tyson的回答声明了'listType:= reflect.TypeOf(* l)'来提供访问字段'Tag'的快捷方式。再次感谢你的帮助! – elithrar