go-playgroup/vaildator hasValue()判断required问题
来源:2-4 深入框架原理与实现
啭地滴猫
2021-07-05 22:32:16
// 曹大,我修改了hasValue(),单独拿出来做一个测试针对int类型无法判断到底是没有传值还是传了0值的情况
// 1、应该其他类型也是一样吧,这个有办法判断到底是传了0还是本身默认的0值吗?
// 2、reflect.Zero(fl.Type()).Interface()。这句代码的意思是获取到该类型的默认值对吗?
//var ii int
//v := reflect.ValueOf(ii)
//p1 := hasValue(v) //false
func hasValue(fl reflect.Value) bool {
switch fl.Kind() {
case reflect.Slice, reflect.Map, reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func:
return !fl.IsNil()
default:
p := fl.IsValid() // true
p=p
p1 := fl.Interface() // 0
p1=p1
p2 := fl.Type()
p2=p2
p3 := reflect.Zero(fl.Type())
p3=p3
p4:=reflect.Zero(fl.Type()).Interface() // 0
p4=p4
return fl.IsValid() && fl.Interface() != reflect.Zero(fl.Type()).Interface() // false
}
}
1回答
这个是 Go 的类型系统的问题,和 validator 没关系
如果一定要判断用户传 0 还是用户没传,那你得把 int 变成指针,只有这一种做法。
这样会增加 GC 的压力,但也没啥好办法~
改成指针以后,要求用户必传的话,写 required 就可以了~
相似问题
回答 1
回答 2