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

use*_*860 1 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
}
Run Code Online (Sandbox Code Playgroud)

我试图使用它,这迫使我做了一些想法.

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

exper := int32(0)
reflect.DeepEqual(
   reflect.Zero(reflect.ValueOf(exper).Type()), 
   reflect.ValueOf(exper)
)
Run Code Online (Sandbox Code Playgroud)

Seb*_*ian 5

请检查godocsreflect.Value:

在两个值上使用==不会比较它们所代表的基础值,而是比较值结构的内容.要比较两个值,请比较Interface方法的结果.

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 
}
Run Code Online (Sandbox Code Playgroud)