2016-03-31 1 views
1

Ich habe diese Art der Validierung in Go-Swagger Paket gefunden.Warum int32 (0) nicht reflect.DeepEqual zum Eingeben von Null in Golang?

// 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 
} 

Ich habe versucht, es zu verwenden, und es zwingt mich für einige Gedanken.

Warum ist das Folgende keine wahre Aussage?

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

Antwort

5

Bitte überprüfen Sie die godocs von reflect.Value:

Mit == auf zwei Werte hat, die zugrunde liegenden Werte nicht vergleichen sie, sondern die Inhalte der Wert structs darstellen. Vergleichen Sie zwei Werte, vergleichen Sie die Ergebnisse der Interface-Methode.

Play

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 
}