首页 文章

反映值接口和指针接收器

提问于
浏览
2

在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 回答

  • 1

    大概是在 case reflect.Struct 之上的某处,有一个开关 reflect.ValueOf(...).Kind()

    如果你看一下反射包中的 Kinddocs here

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

    你需要做 v.Elem().Interface().(Zeroer) 来获取底层元素

    这里可运行的例子https://play.golang.org/p/tx1zgD7Ri0E

相关问题