迭代 Struct 中的字符串字段

我在寻找一个struct的字符串字段遍历,所以我可以做一些清理/验证(与strings.TrimSpacestrings.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

   }


凤凰求蛊
浏览 205回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go