2015-10-14 8 views
5

すべてのタイプが同等であるとは限りません。スライス。ソリューションreflect.DeepEqualGolangで任意の型の変数がゼロであるかどうかを知るには?

var v ArbitratyType 
zero := reflect.Zero(reflect.TypeOf(v)).Interface() 
isZero := reflect.DeepEqual(v, zero) 

ゴードキュメント深い平等約reflect.DeepEqual

DeepEqualテスト - だから我々はこの

var v ArbitraryType 
v == reflect.Zero(reflect.TypeOf(v)).Interface() 

編集を行うことはできません。可能であれば通常の==等値を使用しますが、配列、スライス、マップ、および構造体のフィールドの要素をスキャンします。

答えて

2

Peter Noyesが指摘しているように、比較できない型を比較しないようにする必要があります。幸いなことに、これはreflectパッケージと非常に簡単です:

func IsZero(v interface{}) (bool, error) { 
    t := reflect.TypeOf(v) 
    if !t.Comparable() { 
     return false, fmt.Errorf("type is not comparable: %v", t) 
    } 
    return v == reflect.Zero(t).Interface(), nil 
} 

hereを使用するを参照してください。

2

次の両方が(彼らは同じだせいか?)私に合理的な結果を与える

reflect.ValueOf(v) == reflect.Zero(reflect.TypeOf(v))) 

reflect.DeepEqual(reflect.ValueOf(v), reflect.Zero(reflect.TypeOf(v))) 

例えば様々な整数0のフレーバーと未初期化のstructは "ゼロ"です

悲しいことに空の文字列と配列はありません。 nilは例外を示します。
あなたが望むなら、特別な場合があります。

+0

こんにちは、リズミカル、お返事ありがとうございます!実際、==とDeepEqualは異なります。 DeepEqualは、goドキュメント[reflect.DeepEqual](https://golang.org/pkg/reflect/#DeepEqual) – v1ct0r

+0

によると、比較可能な変数と比較できない変数の両方で動作します。私はまだ比較可能であることを理解していますが、 、ありがとう。 –

関連する問題