2016-03-31 9 views
1

この種の検証はgo-swaggerパッケージにあります。int32(0)が反映されないのはなぜですか?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 
} 

私はそれを使用しようとしましたが、それはいくつかの考えのために私を強制しました。

なぜ以下は真実ではありませんか?

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

答えて

5

reflect.Valuegodocsを確認してください:

二つの値に==を使用すると、それが表す 根本的な値ではなく、値の構造体の内容を比較しません。 2つの値を比較するには、Interfaceメソッドの結果を比較します。

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 
} 
関連する問題