[gogf/gf]Parse不能校验int required

2024-06-25 955 views
7
type ExampleQueryInput struct {
    Cid int    `v:"required#cid can not be empty"`
}

GetStruct 反射创建Stuct时会为其生成0值

if elem.Kind() == reflect.Ptr {
        if !elem.IsValid() || elem.IsNil() {
            e := reflect.New(elem.Type().Elem()).Elem()
            elem.Set(e.Addr())
            elem = e
        } else {
            ...
    }

导致CheckStruct比较时 不能区分int类型是传入的0,还是int默认的0值

if required {
        return !(value == "")
    } else {
        return true
    }

value会为"0"

回答

9

@fulltimelove 你可以使用min规则 image

0

可否在GetStruct和CheckStruct之间配合r.GetRequestMap来解决默认值required的问题?

9
type searchStruct struct {
    PageNum   int    `p:"pageNum" v:"required|integer#pageNum is required|pageNum should be int"`
}

r.Parse 方法不能校验Int类型。

1

当不能校验时,你提交的pageNum参数是什么?

1

能否再具体描述一下?

5

抽时间尝试了下,改动太大,暂时先放弃了 另外文档能否更新下,我看id-number验证规则已经改名resident-id...

4

@gqcn 可否再加一个大于,小于的规则,min和max是小于或等于,大于或等于。

2

麻烦新提一个issue记录一下,和这个issue分开便于管理新功能进度。

5

最终中问题有什么解决方法吗?min解决不了问题,gin用 指正的方式来判断 int 默认值是0的问题

8

@slemon @fulltimelove 你可以将属性改为指针类型则可使用required规则,同时gf框架也是非常非常强大滴支持指针类型属性转换的,例如:

type ExampleQueryInput struct {
    Cid *int    `v:"required#cid can not be empty"`
}