【问题标题】:Validate a Go struct field only if it is populated仅在填充 Go 结构字段时验证它
【发布时间】:2021-08-17 00:57:51
【问题描述】:

我正在使用这个库来验证我的 Go 结构。 https://pkg.go.dev/github.com/go-playground/validator/v10

如何仅在填充字段时对其进行验证?例如,我的一个结构中有一个可选的电话号码字段。如果用户提供了这个值,我想使用 E.164 格式来验证它。

Phone string  `validate:"e164"`

我搜索了“可选”标签,但找不到。

【问题讨论】:

标签: go


【解决方案1】:

使用omitempty 标签。

Phone string  `validate:"e164,omitempty"`

【讨论】:

    【解决方案2】:

    正如关于Multiple Validators 的库文档所述,

    一个字段上的多个验证器将按照定义的顺序进行处理。

    正如上面提到的@Flimzy,您可以使用omitempty 来验证结构上的可选字段,但omitempty 应该排在列表的首位。否则它会被验证并得到一个错误。

    Phone string `validate:"omitempty,e164"`
    

    简单的代码证明如下,你可以在playground上运行

    package main
    
    import (
        "github.com/go-playground/validator/v10"
        "log"
    )
    
    func main() {
        sv := validator.New()
    
        res := Response{}
        err := sv.Struct(&res)
        if err != nil {
            log.Fatalln(err) // no error
        }
    
        res2 := Response2{}
        err = sv.Struct(&res2)
        if err != nil {
            log.Fatalln(err) // error
        }
    
    }
    
    type Response struct {
        Phone string `validate:"omitempty,e164"`
    }
    type Response2 struct {
        Phone string  `validate:"e164,omitempty"`
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2016-12-09
      • 2021-06-30
      • 2014-06-27
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多