2017-01-20 3 views
2

Мне нужна общая функция для проверки того, что-то равно ее нулевому значению или нет.Как использовать функцию reflection.DeepEqual() для сравнения значения указателя с нулевым значением его типа?

Из этого question я смог найти функцию, которая работала с типами значений. Я изменил его поддержку указатели:

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()) 
} 

Unfotunately, это не работает для меня, когда делает что-то вроде этого:

type myStruct struct{} 

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

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

Это потому, что &myStruct{} является указателем, и нет никакого способа разыменования interface{} внутри функции. Как сравнить значение этого указателя с нулевым значением его типа?

ответ

2

reflect.Zero() возвращает reflect.Value. reflect.New() возвращает указатель на нулевое значение.

Я обновил функцию, чтобы проверить случай, когда x является указателем на что-то:

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

Вы должны принять свой собственный ответ. – kostix