如何使用reflect.DeepEqual()将指针的值与其类型的零值进行比较?

时间:2017-01-20 04:46:00

标签: go reflection

我需要一个通用函数来检查某些东西是否等于它的零值。

从这个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())
}

不幸的是,在做这样的事情时,这对我不起作用:

type myStruct struct{}

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

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

这是因为&myStruct{}是一个指针,并且无法在函数内取消引用interface{}。如何将该指针的值与其类型的零值进行比较?

1 个答案:

答案 0 :(得分:3)

reflect.Zero()返回reflect.Valuereflect.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())
}