2017-01-20 4 views
2

何かがゼロ値に等しいかどうかをチェックするための汎用関数が必要です。reflect.DeepEqual()を使用してポインタの値をその型のゼロ値と比較するにはどうすればよいですか?

このquestionから、値型を扱う関数を見つけることができました。このような何かをやったときに、これは私のために動作しませんでした、Unfotunately

func isZeroOfUnderlyingType(x interface{}) bool { 

    rawType := reflect.TypeOf(x) 

    //source is a pointer, convert to its value 
    if rawType.Kind() == reflect.Ptr { 
     rawType = rawType.Elem() 
    } 

    return reflect.DeepEqual(x, reflect.Zero(rawType).Interface()) 
} 

:私はサポートポインタにそれを修正

type myStruct struct{} 

isZeroOfUnderlyingType(myStruct{}) //Returns true (works) 

isZeroOfUnderlyingType(&myStruct{}) //Returns false (doesn't) work 

&myStruct{}がポインタであり、間接参照する方法がないからです関数内にinterface{}があります。そのポインタの値をその型のゼロ値と比較するにはどうすればよいですか?

答えて

2

reflect.Zero()は、reflect.Valueを返します。 reflect.New()は、ゼロ値へのポインタを返します。

func isZeroOfUnderlyingType(x interface{}) bool { 

    rawType := reflect.TypeOf(x) 

    if rawType.Kind() == reflect.Ptr { 
     rawType = rawType.Elem() 
     return reflect.DeepEqual(x, reflect.New(rawType).Interface()) 
    } 

    return reflect.DeepEqual(x, reflect.Zero(rawType).Interface()) 
} 
+0

あなたはあなた自身の答えを受け入れる必要があります。

私はxが何かへのポインタである場合をチェックする機能を更新しました。 – kostix

関連する問題