仅在填充时验证 Go 结构字段

dan*_*nze 0 go

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

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

Phone string  `validate:"e164"`
Run Code Online (Sandbox Code Playgroud)

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

nip*_*una 17

正如库文档中关于多个验证器所述,

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

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

Phone string `validate:"omitempty,e164"`
Run Code Online (Sandbox Code Playgroud)

简单的代码证明如下,您可以在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"`
}
Run Code Online (Sandbox Code Playgroud)


Fli*_*mzy 6

使用omitempty标签。

Phone string  `validate:"e164,omitempty"`
Run Code Online (Sandbox Code Playgroud)