为什么int32(0)不是reflect.DeepEqual在Golang中键入Zero?

时间:2016-03-31 08:38:34

标签: reflection go swagger

我在 go-swagger 包中找到了这种验证。

// Required validates an interface for requiredness
func Required(path, in string, data interface{}) *errors.Validation {
    val := reflect.ValueOf(data)
    if reflect.DeepEqual(reflect.Zero(val.Type()), val) {
        return errors.Required(path, in)
    }
    return nil
}

我试图使用它,这迫使我提出一些想法。

为什么以下不是真实的陈述?

exper := int32(0)
reflect.DeepEqual(
   reflect.Zero(reflect.ValueOf(exper).Type()), 
   reflect.ValueOf(exper)
)

1 个答案:

答案 0 :(得分:5)

请查看reflect.Value的{​​{3}}:

  

在两个值上使用==不会比较它们的基础值   代表,而不是价值结构的内容。比较   两个值,比较接口方法的结果。

godocs

package main

import "reflect"

func main() {
  //var i int32
  exper := int32(0)
  r := reflect.DeepEqual(
    reflect.Zero(reflect.ValueOf(exper).Type()).Interface(),
    reflect.ValueOf(exper).Interface(),
  )
  println(r)  // true 
}