【问题标题】:How can go-validator check fields against their zero value?go-validator 如何根据零值检查字段?
【发布时间】:2020-09-27 20:41:56
【问题描述】:

我正在尝试使用 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 标签,但文档很粗略,我无法按照上述方式使用它。

【问题讨论】:

  • 自动零值与明确设置的完全相同的值无法区分。
  • ...应该会出错,但操场上不会。
  • @andig 我添加了一种方法,看看它是否有帮助

标签: validation go


【解决方案1】:

案例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:"-" 将跳过对该字段的验证

Go Playground

================================================ ======================

案例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)

}

Go Playground

【讨论】:

  • 感谢您提供的示例。恕我直言 case1 不起作用:如果我将 Required.Val 留空,它仍然会通过错误的验证。
  • @andig 你试过了吗?在操场上为我工作
  • 对不起。我的测试一定有问题。可以确认这行得通。我还找到了一种解决方法,通过使用指针接收器来验证 Optional 结构的规则。 “-”标签似乎不是必需的:play.golang.org/p/sgvDL0oqN3l
  • 非常感谢。我花了太多时间如何跳过嵌套结构中的验证。通过使用您建议的解决方案,添加 validate:"-",效果非常好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多