gpt4 book ai didi

rest - 使用validator.v2根据不同字段的值验证字段

转载 作者:行者123 更新时间:2023-12-01 22:12:13 25 4
gpt4 key购买 nike

我有以下(简化的)结构:

type newAppRegister struct {
SomeFlag *bool `json:"someflag" validate:"nonnil"`
ComputeLevel string `json:"compute-level" validate:"computelevelvalidator"`
}
computelevelvalidator是一些验证功能。
我希望如果SomeFlag为false,则需要 ComputeLevel并运行其验证功能。
一种可能的解决方案是创建一个静态变量,并在SomeFlag的自定义验证函数中进行设置,例如:
var someFlag bool

func someFlagValidator(v interface{}, param string) error {
st := reflect.ValueOf(v)
if st.Kind() != reflect.Bool {
return fmt.Errorf("must be bool")
}
someFlag = st.Bool()
return nil
}
然后在 computelevelvalidator中,可以根据他的值进行调节。
但是由于这是一个REST API,并且每秒可能会收到大量调用,所以我不确定使用此静态变量是否可以工作(我担心竞争条件-但我不太确定)。
我正在使用go1.11和验证包 gopkg.in/validator.v2(版本 gopkg.in/validator.v2 v2.0.0-20190827175613-1a84e0480e5b)。

最佳答案

因此,首先:是的,对于同时使用/访问,使用此静态(全局)变量将是一个问题。这不是要走的路。
如果您的验证逻辑是上下文相关的(如您所说:如果标志为false,则某些限制适用于另一个字段),则实现简单的Validate函数非常简单。我知道您使用的软件包支持这种类型的东西,但是外部软件包几乎总是被设计为相当通用的。至少您将最终执行类型声明。最后我检查了一下,您仍然需要显式调用验证validator.Validate(),那么为什么不将其移至您类型的方法上呢?

type newAppRegister struct {} // your type

func (n newAppRegister) Validate() error {
if err := validator.Validate(n); err != nil {
return err
}
// at this point, we now the flag field isn't nit, because it passed validation
if !*n.SomeFlag {
// validate ComputeLevel here
}
return nil
}
无需类型声明,更不用说反射了。仅通过这两个字段,我什至认为根本不需要验证程序包。您可以使用标准JSON标签完成相同的操作:
type Foo struct {
SomeFlag *bool `json:"some_flag,omitempty"`
ComputeLevel string `json:"compute_level"`
}

func (f Foo) Validate() error {
if f.SomeFlag == nil {
return ErrSomeFlagRequired
}
if !*f.SomeFlag {
// validate ComputeLevel
}
return nil
}
使用起来相当简单:
f := Foo{}
if err := json.Unmarshal([]byte(payload), &f); err != nil {
// some shady JSON was submitted
}
if err := f.Validate(); err != nil {
// JSON was technically valid, but payload made no sense
}
// handle valid request

关于rest - 使用validator.v2根据不同字段的值验证字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62879361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com