【发布时间】:2020-07-14 00:44:06
【问题描述】:
我有以下(简化的)结构:
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)。
【问题讨论】:
-
你为什么要使用反射?
-
@Flimzy 复制自文档godoc.org/gopkg.in/validator.v2#hdr-Custom_validation_functions 这似乎是他们编写自定义验证器的方式
-
我看不出有什么理由不使用类型断言。它会更有效率,也更容易阅读:
v, ok := v.(bool); if !ok { return fmt.Errorf("must be bool") } someFlag = v; return nil -
@Flimzy 你说得有道理!谢谢
标签: rest validation go