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回答

Xargin

2021-07-06

这个是 Go 的类型系统的问题,和 validator 没关系


如果一定要判断用户传 0 还是用户没传,那你得把 int 变成指针,只有这一种做法。


这样会增加 GC 的压力,但也没啥好办法~


改成指针以后,要求用户必传的话,写 required 就可以了~

0

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程