我正在尝试使用https://github.com/go-playground/validator并且需要确保用户配置具有填充的内部结构(即不是零(,同时仍然允许可选配置:
type Config struct {
Required Setting `validate:"required"`
Optional Setting
}
type Setting struct {
Val string
}
请参阅https://play.golang.org/p/P_6qY7H64sO在操场上。
换句话说:我可以让一个包含嵌套结构的字段成为针对嵌套结构触发的验证规则所必需的,而另一个具有相同嵌套结构类型的字段是可选的吗?
如果可选字段结构的任何字段为非零,则仍应验证该结构(即,填充了可选字段,因此需要验证(。
更新我注意到了structonly
标记,但文档很粗略,我无法使其如上所述工作。
案例1如果您想跳过可选结构
我想你需要这个
package main
import (
"fmt"
"github.com/go-playground/validator"
)
// Config : Config Struct
type Config struct {
Required Setting
Optional Setting `validate:"-"`
}
// Setting : Setting Struct
type Setting struct {
Val string `validate:"required"`
}
func main() {
val1 := Config{
Required: Setting{Val: "Hello"},
}
val2 := Config{
Optional: Setting{Val: "Hello"},
}
validate := validator.New()
err := validate.Struct(val1)
fmt.Println(err)
err = validate.Struct(val2)
fmt.Println(err)
}
注意,validate:"-"
将跳过该字段的验证
去游乐场
=============================================
案例2如果您想在不同的案例中进行可选验证
或者,如果您希望在不同的条件下使用相同的结构进行不同的验证
你可以用不同的标签做第二个验证器,比如
package main
import (
"fmt"
"github.com/go-playground/validator"
)
// Config : Config Struct
type Config struct {
Required Setting
Optional Setting
}
// Setting : Setting Struct
type Setting struct {
Val string `validate:"required" valid:"omitempty,len=5"` //<---- See This
}
func main() {
val1 := Config{
Required: Setting{Val: "Hello"},
}
val2 := Config{
Optional: Setting{Val: "Hello"},
}
validate := validator.New()
err := validate.Struct(val1)
fmt.Println(err)
err = validate.Struct(val2)
fmt.Println(err)
fmt.Println("Second Validator")
// New Validator
validate2 := validator.New()
validate2.SetTagName("valid") //<---- See This
err = validate2.Struct(val1)
fmt.Println(err)
val1.Optional.Val = "Hel"
err = validate2.Struct(val1)
fmt.Println(val1, err)
val1.Optional.Val = "Hello"
err = validate2.Struct(val1)
fmt.Println(val1, err)
}
去游乐场