反映值接口和指针接收器

时间:2018-05-03 21:15:23

标签: go interface

在golang的mongodb驱动程序中,有以下代码:

case reflect.Struct:
    if z, ok := v.Interface().(Zeroer); ok {
        return z.IsZero()
    }
    return false

Interface Zeroer的定义如下:

type Zeroer interface {
    IsZero() bool
}

当我用

实现我的结构时
func (id SomeStruct) IsZero() bool {
    return id.ID == ""
}

它有效。但是当我使用指针接收器实现IsZero方法时:

func (id *SomeStruct) IsZero() bool {
        return id.ID == ""
 }

类型断言失败,IsZero未执行。

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

大概在case reflect.Struct之上的某处,reflect.ValueOf(...).Kind()

上有一个开关

如果您查看反映包中的Kinddocs here

Struct是其中一种,Ptr是另一种。在switch语句中,它不匹配,因为*SomeStruct方法的接收方中定义的IsZero()类型为Ptr而不是Struct

您需要v.Elem().Interface().(Zeroer)来获取基础元素

此处可运行的示例https://play.golang.org/p/tx1zgD7Ri0E