小编典典

反映值接口和指针接收器

go

在用于golang的mongodb驱动程序中,包含以下代码:

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

接口清零器的定义如下:

type Zeroer interface {
    IsZero() bool
}

当我实现我的结构

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

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

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

类型声明失败,并且IsZero无法执行。

谁可以给我解释一下这个?


阅读 229

收藏
2020-07-02

共1个答案

小编典典

据推测某处之上的case reflect.Struct有上的开关reflect.ValueOf(...).Kind()

如果您Kind在Reflection包中查看,则此处的文档

Struct是其中一种,又Ptr是另一种。在switch语句中,它不匹配,因为*SomeStructIsZero()方法的接收者中定义的种类是Ptrand
not Struct

您需要做得到v.Elem().Interface().(Zeroer)底层元素

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

2020-07-02